2016-08-31 16 views
0

あなたは私のビジネス層のためのUnitOfWorkを実装する助けが必要。 複数の異なるビジネス・サービス・コールを1つのトランザクションにラップしたい。 のは、私は私のリポジトリ層としてEntity Frameworkのを使用して、私は、検証やその他のビジネスルールの追加のビジネス層を持っていると仮定しましょう。この例では、非常に単純です。私のコントローラでASP.NET MVCのUnitOfWorkおよびビジネスサービス/レイヤ

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(); 
    } 
} 

userService.AddUser(user); 
contractService.AddContract(contract); 

...追加のユーザーがすでに変更を保存呼び出しますが、私は、追加契約後に変更を保存します。 私は次のことができますか?または、これは何とか悪いデザインですか?

public class UnitOfWork 
{ 
    public UnitOfWork(MyDbContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public MyDbContext DbContext => _dbContext; 

    public void SaveChanges() 
    { 
     _dbContext.SaveChanges(); 
    } 
} 

変更私のサービス:

は、UnitOfWorkのクラスを作成します

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); 
    } 
} 

をそして、私のコントローラで私が行います

userService.AddUser(user); 
contractService.AddContract(contract); 
unitOfWork.SaveChanges(); 

これが有効なアプローチです!本当に...この上

おかげであなたの助けとの考えを必要!!!!

答えて

0

「UnitOfWork」には、使用例を反映するメソッドが含まれている必要があります。だから私は実際には「ユーザー」と「契約」を追加し、トランザクションをコミットし、ちょうどコントローラからこのメソッドを呼び出す「CreateContract」のようなメソッドを持っているでしょう。

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

    this.dbContext.SaveChanges(); 
} 

この方法で、このメソッド内でトランザクションコードをカプセル化できます。例 - ユーザーとの契約は、単にEFの呼び出しではなく、異なるサービスに呼び出しを追加する場合は、トランザクションをロールバックする分散トランザクションまたは他のコードを持つことができます。

+0

うーん、私は、単一のトランザクションとして実行する必要があり、このようなサービスコールチェーンの数百を持っています。私は単一のUnitOfWorkクラスでこのメソッドをすべて追加することはできません... Okey私は異なる領域のUnitOfWorkクラスを作成できますが、Webアプリケーションの最後にはほとんどすべてのトランザクションが単一のWeb要求/コントローラアクションを表します...すべてのサービスコールが成功したときにコントローラアクションの最後にCommitを呼び出す – Simon

関連する問題