gpt4 book ai didi

asp.net-mvc - 如何在服务层中管理交易?

转载 作者:行者123 更新时间:2023-12-04 15:04:09 26 4
gpt4 key购买 nike

我们正在开发具有以下体系结构的.Net应用程序:表示层(在ASP.Net MVC 2中使用MVC模式),服务层,数据访问层(在Entity Framework上使用存储库模式)。

我们已经决定将事务管理放在服务层中,但是我们不确定如何实现它。我们希望完全在服务层级别上控制事务。也就是说,每次 Controller 在服务层中调用方法时,它都必须是与数据库更新有关的原子操作。

如果在服务层中提供的不同服务之间没有关系,那将很简单:每个方法都应在其执行结束时提交更改(即,在其使用的上下文中调用save方法)。但是有时服务层的服务会协同工作。

例如:我们提供的 cargo 服务具有一种确认方法,该确认方法接收以下参数: cargo ID,一个标志(指示它对应于新客户还是现有客户),客户ID(如果 cargo 确认是针对现有客户的,则为客户ID)客户)和客户名称(如果是新客户)。如果标记设置为“新客户”,则服务层必须(a)创建客户并(b)确认装运。对于(a), cargo 服务调用了客户服务(该客户服务已经实现了创建新客户并将其存储在数据库中所需的验证和逻辑)。

在这种情况下,谁应该承担更改?

  • 客户服务应该这样做吗?它不能在创建新客户之后提交更改,因为稍后在装运确认方法中可能会出问题,但是在直接调用的情况下(必须提供创建客户的情况)它必须提交更改。
  • 调用服务方法的 Controller 应该这样做吗?但控制者对交易一无所知,因此我们决定将所有交易知识放入服务层。
  • 服务层中的事务管理器?如何设计?谁在何时调用它?

  • 有没有我们应该遵循的设计模式?

    最佳答案

    我在我的服务上有一个Commit(),仅当UnitOfWork由服务创建时才提交,如果在构造函数中传递,则该提交不执行任何操作。

    我为服务使用了第二个(内部)构造函数:

    public class MyService
    {
    private IUnitOfWork _uow;
    private bool _uowInternal;

    public MyService()
    {
    _uow = new UnitOfWork();
    _uowInternal = false;
    }

    internal MyService(IUnitOfWork uow)
    {
    _uow = uow;
    _uowInternal = true;
    }
    public MyServiceCall()
    {
    // Create second service, passing in my UnitOfWork:
    var svc2 = new MySecondService(_uow);

    // Do your stuff with both services.
    ....
    // Commit my UnitOfWork, which will include all changes from svc2:
    Commit();
    }

    public void Commit()
    {
    if(!_uowInternal)
    _uow.Commit();
    }
    }

    关于asp.net-mvc - 如何在服务层中管理交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867027/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com