域服务在 DDD 中究竟意味着什么以及如何实现它?

Sim*_*ode 2 c# service entity domain-driven-design aggregateroot

我正在开发一个实现 DDD 概念的 Web 应用程序,我知道 DDD 中的域服务是:

域服务:封装不自然适合域对象的业务逻辑,并且不是典型的 CRUD 操作 - 那些将属于存储库。

但是我很困惑域服务是域模型中的类、接口还是方法,以及我的聚合根/域实体将如何调用该服务?

另外是否需要将聚合根或域实体返回为域服务?

如果我的聚合根需要检查电子邮件是否存在,或检查密码哈希匹配(需要调用服务/存储库来访问数据库)。我是否需要在域服务或应用程序服务中实现该代码?

Con*_*enu 5

但是我很困惑域服务是域模型中的类、接口还是方法

AClassInterface,取决于抽象级别。在某些情况下,它需要一些第三方无状态(!)库,并且您将其作为接口与基础设施层中的实现(在这一层中,您可以调用第三方库)。

我的聚合根/域实体将如何调用该服务

如果它是一个接口,那么您可以将服务传递给聚合的方法或在聚合外部调用它,并将输出作为聚合方法的参数传递(首选方式,因为它最小化了聚合的依赖性)。

如果它是一个类,您也可以在聚合内实例化+使用它,但这会创建从聚合到域服务的依赖关系;这在每种情况下都不是错误的,但您应该在使用它之前考虑一下。

另外是否需要将聚合根或域实体返回为域服务?

不,它可以返回驻留在域层中的任何东西(原始值或值对象)。

如果我的聚合根需要检查电子邮件是否存在,或检查密码哈希匹配(需要调用服务/存储库来访问数据库)。我是否需要在域服务或应用程序服务中实现该代码?

如果它需要进行 IO 调用,那么它不是域服务,而是基础结构服务或应用程序服务。

如果我的聚合根需要检查电子邮件是否存在

在应用程序服务从持久性加载该信息后,该信息必须作为原始值或值对象传递给聚合。