2016-08-31 2 views
0

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 !!!!

Antwort

0

Ihr 'UnitOfWork' sollte Methoden enthalten, die Ihre Anwendungsfälle widerspiegeln. So würde ich eine Methode wie 'CreateContract' haben, die tatsächlich 'Benutzer' und 'Vertrag' hinzufügt und die Transaktion festschreibt und diese Methode nur vom Controller aufruft.

public void CreateContract(User user,Contract contract) 
{ 
    this.dbContext.Users.Add(user); 
    this.dbContext.Contracts.Add(contract); 

    this.dbContext.SaveChanges(); 
} 

Auf diese Weise können Sie Transaktionscode innerhalb dieser Methode kapseln. Ex - Wenn das Hinzufügen eines Benutzers und Vertrags nicht einfach EF-Aufrufe, sondern Aufrufe an verschiedene Dienste sind, können Sie eine verteilte Transaktion oder einen anderen Code zum Zurücksetzen der Transaktion verwenden.

+0

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