Шаблон проектирования Unit of Work выполняет две важные функции: во-первых, он поддерживает обновления в памяти, а во-вторых, отправляет эти обновления в памяти как одну транзакцию в базу данных.
Предположим, что мне нужно использовать веб-службу и обновить таблицу БД в той же единице работы. Традиционно я выполняю следующие шаги:
- Откройте соединение.
- Вызвать метод БД
Insert
(риска нет, если он выполняется, но в этот момент в UOW не выполняется FLUSHED). - Вызов внешней веб-службы (любой службы другой компании).
Если результаты веб-службы равны 200 (ОК), вызовите фиксацию, иначе выполните откат.
using (var unitOfWork = _unitOfWorkManager.Begin()) { _personRepository.Insert(person); externalWebService.IncrementPeopleCount(); unitOfWork.Complete(); }
unitOfWork
имеет один метод: Complete()
. Если веб-сервис получает ошибку, это не проблема. Поскольку я могу генерировать исключение, поэтому метод complete() не выполняется. Но я получаю сообщение об ошибке в Complete () Я должен отменить веб-службу?
Это будет работать нормально, если транзакционный метод Insert () выполняется в БД (еще не фиксируется).
Как я могу выполнить этот сценарий в шаблоне Unit of Work? Или обязательно иметь обратный веб-метод DecrementPeopleCount
?