Ich verwende in meiner Anwendung den ersten Ansatz der Arbeitseinheit für die EF-Kerndatenbank. Ich habe auch Datenbanktransaktionen in Arbeitseinheiten implementiert. Zum Beispiel
public class UnitOfWork : IUnitOfWork
{
private myDBContext _dBContext;
public IDatabaseTransaction BeginTransaction()
{
return new EntityDatabaseTransaction(_dBContext);
}
}
Jetzt habe ich Handler für verschiedene Operationen und jeder Handler hat eine Abhängigkeitsinjektion der Arbeitseinheit. Innerhalb von Handlern verwende ich Transaktionen für den DB-Betrieb. Zum Beispiel
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();
}
}
}
Jetzt wird dieser Handler in einer WebAPI-Methode wie aufgerufen
public void MyAPI()
{
var handler = new Operation1Handler();
handler.Handle();
}
Soweit funktioniert das einwandfrei. Jetzt ist mein Problem, dass ich 2 verschiedene Handler in einer WebAPI-Methode aufrufen muss, die verschiedene DB-Operationen ausführen. Ich möchte jedoch, dass alle Operationen unter beiden Handlern transaktionskonform sind. Wenn also die Operation von Handler 2 fehlschlägt, sollte auch die Operation von Handler 1 rückgängig gemacht werden.
public void MyAPI()
{
var handler = new Operation1Handler();
handler.Handle();
var handler2 = new Operation2Handler();
handler2.Handle();
}
Kann mir jemand helfen, dies zu erreichen.
Ich denke, dass, wenn Sie Ihre DI konfigurieren, IUnitOfWork Lebensdauer Scoped sein sollte. Verwenden Sie die AddScoped-Methode anstelle von AddTransient
Ich stimme dem @ Rabban-Kommentar zu. Beginnen Sie Transaktionen nicht manuell