Транзакции в единице рабочего шаблона для ядра EF
Я использую шаблон unit of work для первого подхода EF core database в своем приложении.
Я также реализовал транзакции базы данных в единице рабочего класса.
Например, для
public class UnitOfWork : IUnitOfWork { private myDBContext _dBContext; public IDatabaseTransaction BeginTransaction() { return new EntityDatabaseTransaction(_dBContext); } }
Теперь у меня есть обработчики для различных операций, и каждый обработчик имеет инъекцию зависимостей единицы работы. Внутри обработчиков я использую транзакции для работы с БД.
Например, для
public class Operation1Handler : BaseHandler { IUnitOfWork _unitOfWork; public Operation1Handler(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public override void Handle() { using(var _trans = _unitOfWork.BeginTransaction()) { //some code _unitOfWork.Entity.SaveAsync(); _trans.Commit(); } } }
Теперь этот обработчик вызывается в методе WebAPI, например
public void MyAPI() { var handler = new Operation1Handler(); handler.Handle(); }
До сих пор это работает совершенно нормально.
Теперь моя проблема заключается в том, что я должен вызвать 2 разных обработчика в методе WebAPI, который будет выполнять различные операции с БД. Но я хочу, чтобы все операции под обоими обработчиками были совместимы с транзакциями, то есть если операция обработчика 2 терпит неудачу, то операция обработчика 1 также должна откатиться.
public void MyAPI() { var handler = new Operation1Handler(); handler.Handle(); var handler2 = new Operation2Handler(); handler2.Handle(); }
Может ли кто-нибудь помочь мне достичь этого.
Что я уже пробовал:
Я читал о распределенной транзакции с использованием области действия транзакции, но не уверен, что она будет работать в этом случае, так как для этого потребуются изменения DbContext.