DDD:在哪里放置域服务的实现

     2023-03-08     81

关键词:

【中文标题】DDD:在哪里放置域服务的实现【英文标题】:DDD: Where to put implementation of domain services 【发布时间】:2017-01-29 09:00:42 【问题描述】:

Domain Service 实现应该驻留在 DDD 项目结构中的什么位置? 如果我们有 IDomainInterfaceDomainInterface 实现,DomainInterface 实现应该驻留在解决方案/项目的基础架构或核心/域部分吗?

【问题讨论】:

【参考方案1】:

领域服务接口及其实现可能驻留在领域层。但是,如果域服务实现依赖于基础架构问题,那么通过应用依赖倒置原则,实现将存在于基础架构层,同时依赖于域中定义的接口。

大多数领域服务将不需要依赖于基础设施问题,并将用于对无法在现有聚合中找到自然归宿的用例进行建模,但某些领域服务会。

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

例如,在 IDDD 的身份和访问有界上下文中,EncryptionService 接口存在于域中,而MD5EncryptionService 具体实现存在于基础架构中。

【讨论】:

域服务与基础设施无关 仅关注基础设施,例如存储库,将在基础设施层实现。域服务及其与存储库的交互将在域层中实现。来自Implementing Domain-Driven Design 的AuthorizationService 就是这样一个例子。 @AlexeyZimarev 当您在域中定义服务合同时,您是关注 UL 还是关注基础架构问题?我当然希望你专注于 UL。例如,如果您的企业正在发送通知,并且如果您实现EmailService,那么通知是通过电子邮件发送的(基础架构问题),我理解您为什么要将其称为基础架构服务,但如果您确实实现了NotificationService相反,它与您的 UL 一致,那么我不明白您为什么不将其视为域服务。 @Robert 好吧,我不认为他们是合理的,但基本上他们不认为需要基础设施细节的服务是域服务,他们称之为基础设施服务。因此,他们说我的示例和 cmets 中的存储库或 NotificationServiceEncryptionServiceCollaboratorService 都是基础架构服务。对我来说这没有任何意义,因为这些服务的接口存在于域中,并且应该在考虑 UL 的情况下进行定义。 在向您解释了这一点后,我更加确定他们错了。 定义服务类型的是接口所在的位置,而不是实现。例如,您不会在域中拥有应用程序服务接口。【参考方案2】:

洋葱或六边形架构表示基础设施层依赖于内部层。 如果合约存在于领域层,那是因为它代表了一些业务需求,代表了无处不在的语言,因此我将其视为领域服务。

如果域服务实现需要某种特定技术(例如数据库访问、SMTP 服务器访问等),则其实现必须位于基础架构层。域根本不关心实现,如果业务专家谈论某事并且我们决定将这个“某事”作为合同,它必须存在于域层中。一切都与领域语言有关。

根据定义,基础设施服务不应位于域层中。如果它与基础设施有关,那么我怀疑它与无处不在的语言有关。我希望看到基础设施服务合同存在于应用层,因为根据定义,应用层是帮助领域的编排层。如果实施需要一些特定的技术,同样,实施将在基础设施层。

所以,总结和回答这个问题: 将域服务实现放在哪里?这取决于:

如果实施不需要来自应用程序或特定技术的任何内容。将实现放在领域层。 (示例:计算的订单号) 如果实现需要来自应用层的任何东西(例如,它需要访问在我看来位于应用层的聚合存储库),则将实现放在应用层中。 如果实施需要特定技术(例如访问 SMTP 服务器或具体的 http 客户端),则将其放置在基础架构层中。

最后,重要的是,在域中我们关心无处不在的语言,在应用程序中,我们编排域,实现取决于它们的依赖关系(域不能依赖任何东西,应用程序只能取决于域)。

【讨论】:

在 DDD 中将存储库实现保存在哪里?

】在DDD中将存储库实现保存在哪里?【英文标题】:WheretoKeeptheRepositoryimplementationsinDDD?【发布时间】:2014-10-1817:28:30【问题描述】:1)根据域驱动设计,域层应该只有存储库接口,实现不应该是域层的一部分-如果我的理解有误,... 查看详情

ddd领域驱动设计实践——架构风格及架构实例

...件的设计提供了指导思想,其将易发生变化的业务核心域放置在限定上下文中,在确保核心域一致性和内聚性的基础上,DDD可以被多种语言和多种技术框架实现,具体的框架实现需要根据实际的业务场景和需求来制定。核心的指... 查看详情

在哪里放置需要从数据库中获取数据的域逻辑

】在哪里放置需要从数据库中获取数据的域逻辑【英文标题】:Wheretoputdomainlogicwhichneedstofetchdatafromdatabase【发布时间】:2011-08-2523:45:54【问题描述】:我知道域逻辑应该放在域对象中。但是,如果我的域逻辑需要来自数据库的数... 查看详情

ddd之2领域概念

...搞清楚这些关键概念名词非常的重要。那它们作用体现在哪里呢?领域是:从事专门活动或者事业的范围。领域的作用是:确定范围和边界DDD研究和解决业务问题过程如下:DDD中的领域是:边界中要解决的业务问题域领域就是范... 查看详情

我在哪里可以找到一些 DDD 的好例子? [关闭]

】我在哪里可以找到一些DDD的好例子?[关闭]【英文标题】:WheredoIfindsomegoodexamplesforDDD?[closed]【发布时间】:2010-10-0702:37:51【问题描述】:我正在学习领域驱动设计,但是有一些让我感到困惑的实际问题,我认为看到一些好的示... 查看详情

图片上传 - 使用 CQRS 和 DDD 放置代码的位置

...、图片(只有一个))我不是要求代码保存图像。但是在哪里调用保存 查看详情

ddd之2领域概念

...搞清楚这些关键概念名词非常的重要。那它们作用体现在哪里呢?领域-子领域领域是:从事专门活动或者事业的范围。?领域的作用是:确定范围和边界DDD研究和解决业务问题过程如下:DDD中的领域是:边界中要解决的业务问题... 查看详情

在 DDD 中公开 ASP.NET 身份服务

】在DDD中公开ASP.NET身份服务【英文标题】:ExposingASP.NETIdentityServicesinDDD【发布时间】:2015-09-2009:07:48【问题描述】:我们正在开发一个使用ASP.NETMVC、C#和EF6开发的基于DDD的应用程序。已决定使用ASP.NET身份服务实现身份验证和授... 查看详情

DDD 命名:域对象

...(DDD)的某些类型的对象:实体、值对象、领域事件和领域服务。其中哪些被视为域对象?还有其他抽象名称可以封装其中的一个子集吗?在谈论DDD或域模型时,我可以识别出各种有用的抽象:实体和值对象。我经常发现自己提到... 查看详情

DDD:在哪里生成实体的 url slug?

】DDD:在哪里生成实体的urlslug?【英文标题】:DDD:wheretogenerateurlslugofanentity?【发布时间】:2015-05-1416:28:31【问题描述】:你如何处理DDD中的urlslug生成?在构造函数内部?但是依赖其他服务的实体不好。作为构造函数参数传递?... 查看详情

供应链商品域ddd实践

...到了答案,有些还是在探索中。最近很荣幸受邀在供应链服务与创新团队做了一次分享,也想在这里把一些经验和想法分享给大家,借此抛砖引玉。DDD是一套方法论,实践能 查看详情

域驱动设计中的访问控制

...的最佳实践。那么领域驱动设计的访问控制逻辑应该放在哪里,应该如何实现呢?(更具体的是DDD+CQRS+ES。)我认为它应该靠近业务逻辑 查看详情

在哪里放置@Transactional?在接口规范或实现中? [复制]

】在哪里放置@Transactional?在接口规范或实现中?[复制]【英文标题】:Wheretoput@Transactional?Ininterfacespecificationorimplementation?[duplicate]【发布时间】:2011-07-2922:07:47【问题描述】:放置@Transactional注释的最佳做法是什么?我应该注释... 查看详情

ddd专栏7:ddd如何指导微服务设计实现

...域模型。这一讲将会介绍如何使用DDD的领域模型来指导微服务架构设计。微服务拆分原则​微服务的技术架构其实并不是很难,SpringCloud技术体系已经很好的涵盖了微服务实现以及运维的方方面面。但是,很多软件开发团队在进... 查看详情

在哪里放置业务逻辑,在控制器或服务中? [复制]

】在哪里放置业务逻辑,在控制器或服务中?[复制]【英文标题】:Wheretoputbusinesslogic,incontrollerorservice?[duplicate]【发布时间】:2019-11-2900:43:24【问题描述】:我正在开发一个SpringWebMVC应用程序。我有与CRUD或复杂操作相关的查询。... 查看详情

等待位置数据时从服务器获取数据的功能放置在哪里

】等待位置数据时从服务器获取数据的功能放置在哪里【英文标题】:Wheretoplacefunctiontofetchdatafromserverwhenwaitingforlocationdata【发布时间】:2015-05-3112:56:04【问题描述】:我正在构建一个应用程序,该应用程序必须根据GooglePlay服务... 查看详情

DDD 架构 - 通用方法/助手的放置位置

】DDD架构-通用方法/助手的放置位置【英文标题】:DDDArchitecture-WhereToPutCommonMethods/Helpers【发布时间】:2014-07-1604:40:29【问题描述】:根据StackOverflow上的thisquestion,在DDD架构中,“帮助器”类可以根据其用途位于不同的层中。例... 查看详情

在哪里放置与 Eloquent 无关的 SQL 查询

】在哪里放置与Eloquent无关的SQL查询【英文标题】:WheretoputnotEloquentrelatedSQLqueries【发布时间】:2014-06-3019:09:05【问题描述】:我使用Eloquent来实现我的模型。它有很多方法可以更轻松地处理模型。但是,在某些情况下,我必须实... 查看详情