DDD:在何处实施域服务

Rob*_*ert 1 domain-driven-design project-structure

域服务实现应位于DDD项目结构中的什么位置?如果我们有IDomainInterfaceDomainInterface实施,应DomainInterface执行驻留在解决方案/项目的基础设施或核心/域的一部分?

pla*_*alx 5

域服务接口及其实现可以驻留在域层中。但是,如果域服务实现依赖于基础结构问题,则通过应用依赖关系反转原理,该实现将驻留在基础结构层中,同时取决于域中定义的接口。

大多数域服务将不必依赖基础结构问题,而将用于为无法在现有集合中找到自然家园的用例建模,但某些域服务将可以。

存储库是需要基础结构知识的最常见的域服务,因此您会发现它们的实现位于基础结构层中,但是还有其他示例。

例如,在IDDD的“身份和访问”受限上下文中,EncryptionService接口位于域中,而MD5EncryptionService具体实现位于基础结构中。

  • 域服务与基础设施无关 (4认同)
  • @Robert Well,我认为它们是没有道理的,但是基本上他们不认为需要基础结构详细信息的服务是域服务,因此将其称为基础结构服务。因此,他们说在我的示例和注释中,存储库或“ NotificationService”或“ EncryptionService”或“ CollaboratorService”都是基础架构服务。对我而言,这是没有意义的,因为这些服务的接口位于域中,并且应在考虑UL的情况下进行定义。 (3认同)
  • 在基础设施层中将仅实现基础设施问题,例如存储库。域服务及其与存储库的交互将在域层中实现。[AuthorizationService](https://github.com/VaughnVernon/IDDD_Samples_NET/blob/90fcc52d9c1af29640ec2a8a3e0e7c692f3e6663/iddd_identityaccess/Domain.Model/Access/AuthorizationService.cs)来自[Implementing Domain.https://Drive.www. /Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577) 就是这样一个例子。 (2认同)
  • @AlexeyZimarev 当您在域中定义服务合同时,您是关注 UL 还是关注基础设施问题?我当然希望你专注于 UL。例如,如果您的企业正在发送通知,并且如果您实现了“EmailService”,那么碰巧通过电子邮件发送通知(基础设施问题),我理解您为什么要将其称为基础设施服务,但如果您确实实现了“NotificationService”相反,它与您的 UL 保持一致,那么我不明白您为什么不将其视为域服务。 (2认同)
  • 向您解释了这一点之后,我什至可以肯定他们是错的。**定义服务类型的是接口所在的位置,而不是实现**。例如,您在域中将没有应用程序服务接口。 (2认同)