【发布时间】:2014-06-20 07:19:24
【问题描述】:
有一个项目是用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();
}
}
那么保存功能的最佳位置在哪里?
【问题讨论】:
标签: asp.net-mvc architecture repository unit-of-work n-layer