关于N层架构,哪里是保存功能的最佳位置?

时间:2014-06-20 07:19:24

标签: asp.net-mvc architecture repository unit-of-work n-layer

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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