【发布时间】:2017-01-07 19:18:38
【问题描述】:
需要您帮助为我的业务层实施 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();
这是一种有效的方法吗?!真的需要你的帮助和想法......
谢谢!!!!
【问题讨论】:
标签: c# asp.net asp.net-mvc unit-of-work business-layer