0

有一个项目是用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();
    }
}

那么保存功能的最佳位置在哪里?

4

1 回答 1

0

顶层/入口点。它现在唯一可以在同一事务中处理哪些事情的地方。

在这种情况下,MVC 控制器操作。

如果您使用命令/查询分离模式,该命令将控制事务,因为每个命令都代表一个用例。

于 2014-06-20T21:02:33.247 回答