Sim*_*ode 2 c# service entity domain-driven-design aggregateroot
我正在开发一个实现 DDD 概念的 Web 应用程序,我知道 DDD 中的域服务是:
域服务:封装不自然适合域对象的业务逻辑,并且不是典型的 CRUD 操作 - 那些将属于存储库。
但是我很困惑域服务是域模型中的类、接口还是方法,以及我的聚合根/域实体将如何调用该服务?
另外是否需要将聚合根或域实体返回为域服务?
如果我的聚合根需要检查电子邮件是否存在,或检查密码哈希匹配(需要调用服务/存储库来访问数据库)。我是否需要在域服务或应用程序服务中实现该代码?
但是我很困惑域服务是域模型中的类、接口还是方法
AClass
或Interface
,取决于抽象级别。在某些情况下,它需要一些第三方无状态(!)库,并且您将其作为接口与基础设施层中的实现(在这一层中,您可以调用第三方库)。
我的聚合根/域实体将如何调用该服务
如果它是一个接口,那么您可以将服务传递给聚合的方法或在聚合外部调用它,并将输出作为聚合方法的参数传递(首选方式,因为它最小化了聚合的依赖性)。
如果它是一个类,您也可以在聚合内实例化+使用它,但这会创建从聚合到域服务的依赖关系;这在每种情况下都不是错误的,但您应该在使用它之前考虑一下。
另外是否需要将聚合根或域实体返回为域服务?
不,它可以返回驻留在域层中的任何东西(原始值或值对象)。
如果我的聚合根需要检查电子邮件是否存在,或检查密码哈希匹配(需要调用服务/存储库来访问数据库)。我是否需要在域服务或应用程序服务中实现该代码?
如果它需要进行 IO 调用,那么它不是域服务,而是基础结构服务或应用程序服务。
如果我的聚合根需要检查电子邮件是否存在
在应用程序服务从持久性加载该信息后,该信息必须作为原始值或值对象传递给聚合。