nagendrathecoder Ответов: 0

Транзакции в единице рабочего шаблона для ядра 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.

0 Ответов