あなたは私のビジネス層のための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();
これが有効なアプローチです!本当に...この上
おかげであなたの助けとの考えを必要!!!!
うーん、私は、単一のトランザクションとして実行する必要があり、このようなサービスコールチェーンの数百を持っています。私は単一のUnitOfWorkクラスでこのメソッドをすべて追加することはできません... Okey私は異なる領域のUnitOfWorkクラスを作成できますが、Webアプリケーションの最後にはほとんどすべてのトランザクションが単一のWeb要求/コントローラアクションを表します...すべてのサービスコールが成功したときにコントローラアクションの最後にCommitを呼び出す – Simon