有一个项目由asp.net mvc 4和实体框架5开发。它的架构是三层的,有存储库,服务和UI。
现在有一个问题:在哪里调用保存功能?
1)将保存放入服务层。
如果调用InventoryService.UpdateInventory成功,但genericRepository.unitOfWork.SaveChanges [2]失败,则数据不一致。
代码:
public class InventoryService
{
private GenericRepository _genericRepository;
public InventoryService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateInventory()
{
//...
_genericRepository.unitOfWork.SaveChanges(); //1
}
}
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
InventoryService.UpdateInventory();
//...
_genericRepository.unitOfWork.SaveChanges();//2
}
}
//note the _genericRepository is same.
2)在服务中添加交易 如果某个函数调用OrderService.UpdateOrder并且它还包含save函数,那么我们必须在函数中添加transation。 有嵌套事务,会产生严重的性能问题。
代码:
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
_genericRepository.unitOfWork.BeginTransaction();
try
{
InventoryService.UpdateInventory();
//...
_genericRepository.unitOfWork.SaveChanges();//2
_genericRepository.unitOfWork.CommitTransaction();
}
catch()
{
_genericRepository.unitOfWork..RollBackTransaction();
}
}
}
3)将保存放在Web层中。 这种方式为UI添加了不必要的任务并破坏了n层架构。
代码:
public class InventoryService
{
private GenericRepository _genericRepository;
public InventoryService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateInventory()
{
//...
}
}
public class OrderService
{
private GenericRepository _genericRepository;
public OrderService(GenericRepository genericRepository){
_genericRepository = genericRepository;
}
public int UpdateOrder()
{
InventoryService.UpdateInventory();
//...
}
public void Save()
{
_genericRepository.unitOfWork.SaveChanges();
}
}
public class OrderController : Controller
{
public ActionResult update()
{
OrderService.UpdateOrder();
OrderService.Save();
}
}
那么保存功能的最佳位置在哪里?
答案 0 :(得分:0)
顶层/入口点。它是唯一可以在同一交易中处理哪些事情的地方。
在这种情况下,MVC控制器动作。
如果您使用命令/查询分离模式,该命令将控制事务,因为每个命令代表一个用例。