müssen Sie bei der Implementierung von UnitOfWork für meine Business-Schicht helfen. Sie möchten mehrere verschiedene Business Service-Aufrufe in eine einzelne Transaktion einbinden. Nehmen wir an, ich verwende Entity Framework als meine Repository-Schicht und ich habe eine zusätzliche Business-Schicht für die Validierung und andere Geschäftsregeln. In diesem Beispiel einfach sehr sehr einfach.ASP.NET MVC UnitOfWork und Business Services/Layer
public class MyDbContext
{
public DbSet<User> Users;
public DbSet<Contract> Contracts;
}
public class UserService
{
public UserService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public void AddUser(User user)
{
_dbContext.Users.Add(user);
_dbContext.SaveChanges();
}
}
public class ContractService
{
public ContractService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public void AddContract(Contract contract)
{
_dbContext.Contracts.Add(contract);
_dbContext.SaveChanges();
}
}
In meinem Controller:
userService.AddUser(user);
contractService.AddContract(contract);
... Der Add Benutzer ruft bereits Änderungen speichern, aber ich möchte die Änderungen speichern, nachdem Vertrag hinzufügen. Also kann ich folgendes tun ?? Oder ist das irgendwie schlechtes Design ?!
erstellen UnitOfWork Klasse:
public class UnitOfWork
{
public UnitOfWork(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public MyDbContext DbContext => _dbContext;
public void SaveChanges()
{
_dbContext.SaveChanges();
}
}
ändern meine Dienste:
public class UserService
{
public UserService(UnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void AddUser(User user)
{
_unitOfWork.DbContext.Users.Add(user);
}
}
public class ContractService
{
public ContractService(UnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void AddContract(Contract contract)
{
_unitOfWork.DbContext.Contracts.Add(contract);
}
}
Und dann in meinem Controller ich tun:
userService.AddUser(user);
contractService.AddContract(contract);
unitOfWork.SaveChanges();
Ist das ein brauchbares Konzept ?! Wirklich brauchen Sie Ihre Hilfe und Gedanken zu diesem ...
Vielen Dank !!!!
Hmmm, aber ich habe Hunderte solcher Service-Aufruf-Ketten, die als einzelne Transaktion ausgeführt werden sollten. Ich kann nicht alle Methoden in einer einzigen UnitOfWork-Klasse hinzufügen ... Okey ich könnte eine UnitOfWork-Klasse für verschiedene Bereiche erstellen, aber am Ende meiner Webanwendung stellt fast jede Transaktion eine einzige Webrequest/Controller-Aktion dar ... Deshalb möchte ich Aufruf des Commits am Ende einer Controller-Aktion, wenn alle Serviceaufrufe erfolgreich waren ... – Simon