A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://docs.umbraco.com/umbraco-commerce/key-concepts/unit-of-work below:

Unit of Work | Umbraco Commerce

Unit of Work | Umbraco Commerce
  1. Key Concepts
Unit of Work

Transactional updates using the Unit of Work pattern in Umbraco Commerce.

When working with Umbraco Commerce's API it is important that data integrity is maintained should any errors occur. In order to achieve this Umbraco Commerce uses the Unit of Work pattern to effectively create a transaction that wraps around sections of your code ensuring that all Umbraco Commerce write operations that occur within that code block must succeed and be persisted in their entirety, otherwise, none of them should, and the database should rollback to its state prior to when those changes were made.

Creating a unit of work will require access to Umbraco Commerce's IUnitOfWorkProvider which can be injected into your Controller directly, or can also be accessed via the UoW property on the IUmbraco CommerceApi helper.

Once you have access to either of these entry points, you can define a Unit of Work as follows

await _uowProvider.ExecuteAsync(async (uow) =>
{
    // Perform your write operations here

    uow.Complete();
});

The anatomy of a Unit of Work includes an ExecuteAsync method call on the IUnitOfWorkProvider instance. This method accepts an async delegate function with a uow argument. Inside the delegate, perform tasks and confirm the Unit of Work as complete by calling uow.Complete(). If you forget to call uow.Complete() or encounter an exception, then any write operations within that code will not be persisted in the database.

Unit of Work Best Practice

When using a Unit of Work it is best practice that you should perform all write operations inside a single Unit of Work and not create individual Units of Work per write operation.

Perform all write operations in a single Unit of Work

await _uowProvider.ExecuteAsync(async (uow) =>
{
    // Create a Country
    var country = await Country.CreateAsync(uow, storeId, "DK", "Denmark");

    await _countryService.SaveCountryAsync(country);

    // Create a Currency
    var currency = await Currency.CreateAsync(uow, storeId, "DKK", "Danish Kroner", "da-DK");

    await _currencyService.SaveCurrencyAsync(currency);

    uow.Complete();
});

It is not recommended to create a Unit of Work per write operation.

await _uowProvider.ExecuteAsync(async (uow) =>
{
    // Create a Country
    var country = await Country.CreateAsync(uow, storeId, "DK", "Denmark");

    await _countryService.SaveCountryAsync(country);

    uow.Complete();
});

await _uowProvider.ExecuteAsync(async (uow) =>
{
    // Create a Currency
    var currency = await Currency.CreateAsync(uow, storeId, "DKK", "Danish Kroner", "da-DK");

    await _currencyService.SaveCurrencyAsync(currency);

    uow.Complete();
});

Last updated 4 months ago


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4