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

标签 asp.net-mvc entity-framework transactions service-layer

我们正在开发具有以下体系结构的.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/

    相关文章:

    c# - Entity Framework 修改集合属性并关闭检测更改

    java - Spring 全局事务与本地事务

    css - 如何使多行文本框填充父div

    c# - Twitter 的 OAuthWebSecurity "Remember me"

    c# - 返回对象计数和列表的 Linq toEntity 查询

    entity-framework - Entity Framework 中的枚举 - 如何创建它

    database - ACID 和数据库事务如何工作?

    nhibernate - 何时在 ASP.NET MVC 2 应用程序中提交 NHibernate 事务?

    javascript - 确认或取消从我的 Excel 文件上传数据后

    c# - 寻求有关如何将 JS 代码与 View 解耦的建议