【发布时间】:2017-04-17 15:29:27
【问题描述】:
我有一些从外部 api 获取产品列表的中间件代码。我正在对响应进行建模并将响应返回给我的代码的客户端。
我的代码的任何客户都不关心返回的单个产品的细节:他们只想要产品的集合。
如何使用 ddd 建模?
每个产品属性一个值对象,一个产品一个实体和一个包含所有产品的存储库?
【问题讨论】:
标签: domain-driven-design value-objects
我有一些从外部 api 获取产品列表的中间件代码。我正在对响应进行建模并将响应返回给我的代码的客户端。
我的代码的任何客户都不关心返回的单个产品的细节:他们只想要产品的集合。
如何使用 ddd 建模?
每个产品属性一个值对象,一个产品一个实体和一个包含所有产品的存储库?
【问题讨论】:
标签: domain-driven-design value-objects
为什么不使用 CQRS (https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs)。
将您的模型分为读写模型。在您的情况下,阅读模型就可以了。让他们成为 POCO。在读取方面,我们不需要使用 DDD 战术建模工具。
欲了解更多信息,请访问我提供的链接。
【讨论】:
我想你快到了,你的中间件(外部 api)可以是一个存储库,通过查找方法和返回产品模型。
建议将存储库作为接口(例如 ProductRepository),以使代码更具可测试性。您可以有简单的测试实现(例如 ProductRepositoryTestImpl)和中间件通信的主要实现(例如 ProductRepositoryImpl)。
对于包装,我更喜欢这个:
domain
\model
\product
|Product
|ProductRepository
infrastructure
\persistence
\YOUR_EXTERNAL_API_NAME
|ProductRepositoryImp
\eclipselink
...
\test
\...
|ProductRepositoryTestImpl
【讨论】:
您应该会看到像 external bounded context 这样的外部 api。您的local bounded context 将使用anti-corruption layer 将术语从远程转换为本地有界上下文。因此,您的代码实际上是anti-corruption layer。
现在,您应该将这些产品保留为entities 还是value objects?这取决于您当地的使用情况。您是否修改这些产品。如果你不修改它们,那么它们就是Value objects。
在任何情况下,您可能都必须使用repository 来持久化/检索产品。
【讨论】: