I have a domain entity with the saveToFile method. This method takes an implementation of the ToFileSavable interface. And now a few questions. What is this interface in DDD? Is it a port and its impementation are adapters? In what layers should these 2 elements be placed? How does this relate to domain services?
1 回答
首先,保存或持久化域实体是存储库的责任,域实体本身不应该知道您是否保存了它。
例如,您有一个客户实体并且您正在实施“updateEmail”用例,这将如下所示
-Application Layer
-> UpdateCustomerEmailUseCase (CustomerRepositoryContract customerRepo)
->Domain Layer
--> Customer
->Infrastructure Layer
-> CustomerRepository implements CustomerRepositoryContract
UserRepositoryContract:有一个抽象的 getById 和 save 方法。
UpdateCustomerEmailUseCase:用例的职责,一般来说,是编排高级业务逻辑,例如从存储库中获取用户,然后在客户实体中调用“updateEmail”方法,然后将客户保存到存储库中。
Customer : 有 updateEmail 的客户域实体,这里需要应用业务规则和不变量。
CustomerRepository:CustomerRepositoryContract 的实现,它只知道如何将客户保存在数据库或文件中。
DDD中的这个接口是什么?它是一个端口,它的实现是适配器吗?
端口是一个入口点,由核心逻辑提供。它定义了一组函数,在本例中为 CustomerRepositoryContract
适配器是应用程序和应用程序所需的服务之间的桥梁。它适合一个特定的端口,在这种情况下是 CustomerRepository
这与域服务有什么关系?
领域服务携带不适合实体和价值对象的领域知识。正如您所注意到的,我们在这里没有使用任何域服务,因为域逻辑适合我们的客户实体。
作为域服务实现的示例,如果您正在实现“changePassword”用例并且业务需求之一是加密该密码,则加密逻辑将不适合 User 实体,您将需要 EncryptionService 持有那个逻辑,应用层(ChangePassUseCase)然后会调用服务加密密码,然后在域实体中调用changePass,最后保存在repository中。
在这里查看更多信息: https ://enterprisecraftsmanship.com/posts/domain-vs-application-services/
我希望这回答了你的问题