Ich möchte Sie fragen, ob meine Idee gut funktionieren wird.
Ich habe kürzlich damit begonnen, Entity Framework und WCF zu verwenden. In meinem aktuellen Projekt möchte ich jeden Service atomar haben, das heißt, ein Service in einer Transaktion. Aber ich möchte nicht den gleichen Transaktionscode für alle Service-Vorgänge mehrmals schreiben. Dann kam mir die Idee, dass die Transaktion und deren Fehlerbehandlung an einem Ort wie im Code-Schnipsel unten in IOperationInvoker
durchgeführt werden.
Der Vorteil dieses Tricks ist, dass ich DbContext
instanziieren oder die Transaktion im using-Block erstellen kann, sodass sie unabhängig vom Geschehen im Service sicher entsorgt werden. und ich muss die db-bezogene Ausnahme nur einmal behandeln.
Es scheint zu funktionieren. aber ich mache mir Sorgen, ob dies eine legitime Art ist, IOperationInvoker
und EF zu verwenden.
Gibt es Nachteile?
// Dienst-Basisklasse
public abstract MyBaseService
{
DbContext Datenbank {get; set;}
}
[ServiceContract]
public Schnittstelle IMyService {...}
// konkrete Dienstklasse
public class MyService : MyBaseService, IMyService {...}
public class MyOperationInvoker : IOperationInvoker
{
IOperationInvoker originalOperationInvoker; // beim Bau zu setzen
public object Invoke(object Instanz, object[] Eingaben, out object[] Ausgaben)
{
using (var dbContext = new MyDbContext())
{
// Inject DbContext in meinen Dienst, um ihn zu verwenden.
(MyServiceBase)Instanz.Datenbank = dbContext;
// Einen Dienst innerhalb einer db-Transaktion aufrufen.
using (var Transaktion = dbContext.Database.BeginTransaction())
{
try
{
objct ret = originalOperationInvoker.invoke(Instanz, Eingaben, Ausgaben);
Transaktion.Commit();
return ret;
}
catch (Exception e)
{
Transaktion.Rollback();
throw;
}
}
}
}
...
}