有一个项目是用asp.net mvc 4和entity framework 5开发的,它的架构是三层的,有repository、service和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并且它还包含保存功能,则在服务中添加事务。所以我们必须在函数中添加事务。存在嵌套事务,这会产生严重的性能问题。
代码:
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();
}
}
那么保存功能的最佳位置在哪里?