asp.net-mvc – 如何管理服务层中的事务?

我们正在开发一个具有以下架构的.Net应用程序:表示层(使用带有ASP.Net MVC 2的MVC模式),服务层,数据访问层(使用实体框架上的存储库模式).

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

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

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

谁应该在这种情况下提交更改?

>客户服务部门应该这样做吗?它在创建新客户后无法提交更改,因为稍后在发货确认方法中可能会出现问题,但是在直接调用的情况下它必须提交更改(在其他用例中,提供用于创建客户端).
>调用服务方法的控制器应该这样做吗?但是控制器不应该对交易有任何了解,我们决定将所有交易知识放在服务层.
>服务层中的事务管理器?如何设计它?谁叫它什么时候?

我们应该遵循这样的设计模式吗?

解决方法

我的服务上有一个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();
}
}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....