[英]ASP.NET MVC UnitOfWork and Business Services / Layer
需要您幫助為我的業務層實施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);
...添加用戶呼叫已保存更改,但我想在添加合同后保存更改。 那我可以做以下事情嗎? 還是這是某種不好的設計?
創建UnitOfWork類:
public class UnitOfWork
{
public UnitOfWork(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public MyDbContext DbContext => _dbContext;
public void SaveChanges()
{
_dbContext.SaveChanges();
}
}
將我的服務更改為:
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”應包含反映您的用例的方法。 因此,我將擁有一個類似'CreateContract'的方法,該方法實際上添加了'user'和'contract'並提交了交易,並且僅從控制器調用了該方法。
public void CreateContract(User user,Contract contract)
{
this.dbContext.Users.Add(user);
this.dbContext.Contracts.Add(contract);
this.dbContext.SaveChanges();
}
這樣,您可以在此方法中封裝任何事務代碼。 例如-如果添加用戶和合同不僅是EF調用,而且是對其他服務的調用,則可以使用分布式事務或其他代碼來回滾事務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.