Transactions 在域驱动设计中,您通常在哪里实现事务逻辑? 在消费者法典中?(像一个控制器) 在存储库中 服务业

Transactions 在域驱动设计中,您通常在哪里实现事务逻辑? 在消费者法典中?(像一个控制器) 在存储库中 服务业,transactions,domain-driven-design,Transactions,Domain Driven Design,首先,这是一个极具争议的问题,因此你肯定会得到许多不同的答案 我个人认为,(ACID)事务是某些存储机制(特别是关系数据库)的一个特征,因此,我认为特定于技术的概念。在任何人抗议这仅仅是一个理论论证认为,有几个可想象的情况下,数据存储(储存库)不是事务性的: 许多大型企业(如Amazon)出于性能原因不使用事务。相反,他们有一个能够处理故障的体系结构 基于REST的数据服务 双打 由于域模型应该与特定的实现解耦,我认为它们对事务一无所知是合乎逻辑的。然而,这也意味着存储库必须公开正确粒度的操

首先,这是一个极具争议的问题,因此你肯定会得到许多不同的答案

我个人认为,(ACID)事务是某些存储机制(特别是关系数据库)的一个特征,因此,我认为特定于技术的概念。在任何人抗议这仅仅是一个理论论证认为,有几个可想象的情况下,数据存储(储存库)不是事务性的:

  • 许多大型企业(如Amazon)出于性能原因不使用事务。相反,他们有一个能够处理故障的体系结构
  • 基于REST的数据服务
  • 双打
由于域模型应该与特定的实现解耦,我认为它们对事务一无所知是合乎逻辑的。然而,这也意味着存储库必须公开正确粒度的操作,以便它们自己能够管理事务(如果它们希望这样做的话),并且一个操作可以保证整体成功或失败

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



然而,在某些情况下,这可能需要存储库拥有太多的领域知识,因此设计模式为您真正需要(潜在)事务来跨越多个不同存储库上的多个操作的情况提供了很好的抽象。

+1用于存储库。我倾向于同意你的观点,交易是特定于技术的。然而,工作单元是特定于应用程序的,所以我想知道如何将技术与工作单元解耦。存储库真的需要了解您的业务领域吗?@Robert Harvey:谢谢。工作单位是一个非常相关的模式,我不知道我是如何在写我的答案时暂时忘记它的。。。除非您想将所有输入和输出分解为基本类型(在我看来,这不是一个好主意),否则存储库需要对域模型有一些了解,但我同意知识不应该扩展到业务逻辑。在大多数情况下,事务逻辑应该驻留在存储库中,这似乎是合理的。然而,使用一个工作单元,IMO会将责任提升一个档次。您认为它在哪里更合适,是应用程序级别还是服务级别?我想不出一个好的理由来证明一个或另一个没有特定的背景。。。?