【发布时间】:2009-01-09 17:01:01
【问题描述】:
在一个领域驱动的设计中,您要使用非贫血领域模型,您如何决定在您的领域对象和面向服务的方法中实现什么?
编辑:我用一个不同的方式问了这个例子,得到了更好的答案here
【问题讨论】:
在一个领域驱动的设计中,您要使用非贫血领域模型,您如何决定在您的领域对象和面向服务的方法中实现什么?
编辑:我用一个不同的方式问了这个例子,得到了更好的答案here
【问题讨论】:
DDD 的理念是域模型包含您的数据和大部分业务逻辑。服务通常处理这些结构的持久性。
还有所有介于两者之间的情况,即业务流程由多个步骤组成,这些步骤总是会更改/修改域对象。您通常使用服务来实现某些过程。因此,通常您会使用服务的结果更新域对象。你永远不要让领域对象实现自己调用服务!
所以看到这样的代码是很常见的:
if (order.isValidForPurchase() && orderValidatorService.isValidOrder( order))
orderService.order( order)
仅仅是因为订单对象知道部分真相,而有些则需要orderValidatorService 知道的外部数据。可以说这两行代码也可以在orderService.order 方法中。
我认为研究这些过程中存在多少领域对象总是值得的;有时通过提出比您最初想象的更多的概念可以获得很多。它实际上是业务流程状态和对象模型的交集。通常 DDD 模型倾向于尝试从过于结构化的视图中捕获领域,IMO 忽略了核心流程有点过分。因此,如果您过于结构化,我认为您制作了一个 Order 对象。如果您添加进程,您可能会创建ShoppingCartOrder、UnshippedOrder、ShippedOrder、BilledOrder 和HistoricalOrder。这有时也会使您的服务集成更简单。
【讨论】: