您通常会在域驱动设计中实现事务逻辑?

时间:2009-12-03 18:30:09

标签: transactions domain-driven-design

  • 在消费者代码中? (像控制器一样)
  • 在存储库中?
  • 在服务中?

1 个答案:

答案 0 :(得分:3)

对于初学者来说,这是一个非常有争议的问题,所以你一定会得到很多不同的答案。

我自己的看法是(ACID)事务是某些存储机制(最着名的是关系数据库)的一个特性,所以我认为特定于技术的概念。在任何人抗议这只是一个理论论点之前,请考虑有几种可能的情况,数据存储(存储库)不会是事务性的:

  • 许多大型企业(例如亚马逊)出于性能原因不使用交易。相反,他们有一个架构,使他们能够处理失败
  • 基于REST的数据服务
  • 测试双打

由于Domain Models应该与特定的实现分离,我发现他们对事务一无所知是合乎逻辑的。但是,这也意味着存储库必须公开正确粒度的操作,以便它们自己可以根据需要管理事务,并确保操作成功或失败。

换句话说,存储库应该管理事务(如果适用)。


然而,在某些情况下,这可能需要存储库具有太多的域知识,因此Unit of Work设计模式为您真正需要(潜在)事务跨越多个的情况提供了良好的抽象在几个不同的存储库上运行。