我们正在开发一个具有以下架构的 .Net 应用程序:表示层(使用带有 ASP.Net MVC 2 的 MVC 模式)、服务层、数据访问层(使用实体框架上的存储库模式)。
我们决定将事务管理放在服务层,但我们不确定如何实现它。我们希望完全在服务层级别控制事务。也就是说,每次控制器调用服务层中的方法时,它必须是关于数据库更新的原子操作。
如果服务层中提供的不同服务之间没有关系,那么就很简单:每个方法都应该在其执行结束时提交更改(即,在它使用的上下文中调用 save 方法)。但有时服务层的服务协同工作。
例如:我们提供的发货服务有一个确认方法,该方法接收以下参数:发货 id,指示它是对应于新客户还是现有客户的标志,客户 ID(如果发货确认是针对现有客户)客户)和客户名称(如果是新客户)。如果标志设置为“新客户”,则服务层必须 (a) 创建客户并 (b) 确认发货。对于 (a) 发货服务调用客户服务(它已经实现了创建新客户并将其存储在数据库中所需的验证和逻辑)。
谁应该在这种情况下提交更改?
- 客服该不该做?创建新客户后它无法提交更改,因为稍后在发货确认方法中可能会出错,但它必须在直接调用的情况下提交更改(在其他用例中,提供用于创建客户端)。
- 调用服务方法的控制器应该这样做吗?但是控制器不应该对交易一无所知,我们决定将所有交易知识放在服务层中。
- 服务层中的事务管理器?如何设计它?,谁叫它,什么时候?
是否有我们应该遵循的设计模式?