【问题标题】:About N-layer architecture, where is the best place for save function?关于 N 层架构,保存功能的最佳位置在哪里?
【发布时间】: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


    【解决方案1】:

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

    在本例中为 MVC 控制器操作。

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

    【讨论】:

    • 谢谢你,jgauffin。现在我应该学习命令/查询分离。因为我是新人,所以无法在你的答案上签名有用,抱歉。
    • 没有。如果您不使用 CQS,答案是 In this case the MVC controller action
    猜你喜欢
    • 2010-12-24
    • 2011-03-30
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多