领域驱动的设计 - 一个真实例子的问题

时间:2017-08-21 14:30:59

标签: domain-driven-design

我想潜入" DDD"并且我正面临着如何明确地实施一个案例" DDD" -way的一些问题。这是我的域模型的一部分。 domain model

我想要实现的目标如下:让我们说我有技术人员开车给一些客户。他在一天的多次巡演中将他的访问分开。因此,例如有一天他在早上有3次访问,下午有一次访问,有2次访问。在每次访问时,他都会参加一项或多项活动,这些活动也可能具有亚活动。

技术人员可以通过支付协议付款,该协议具有每项活动的位置。协议可能会随着时间的推移而变化,因此它有一些日期可以确定它何时处于活动状要将活动映射到活动位置,它有一个抽象ID,将根据PaymentAgreement转换为contrete ActivitiPosition。

现在,技术人员想要预订一天并创建发票或将InvoicePosition添加到现有发票。要创建InvoicePosition,我需要来自Tour(驱动公里)的信息,访问(付款协议可能因客户而异),活动和当天有效的PaymentAgreement。

在预订一天之前需要进行一些验证,并且在业务逻辑中存在一些特殊情况,我将不再详述。

我现在的问题是:谁负责在" DDD" -way中创建什么?我应该在InvoicePosition中创建一个工厂方法,它接受km,访问,活动和PaymentAgreement的来源(以确定实际的一个,因为保持对存储库的访问不应该在实体中完成,对吧?)?或者我应该将所有信息移交给活动以创建InvoicePosition(或InvoicePositions列表)?或者是否应该有一个额外的对象(某种转换器?)?

正在移交"来源" (这将是一个存储库)PaymentAgreements转换函数是一个很好的选择?有替代解决方案吗?

Java / CDI开发人员还有一个问题:由于实体不在CDI环境中,将CDI事件作为域事件发送的准确方法是什么?这是一个JavaEE项目。每个实体都应该由CDI管理吗?或者我是否必须手动将CDI事件总线注入每个实体(我不希望这样,因为这似乎是一个干扰黑客,而不是一个干净的解决方案)?

1 个答案:

答案 0 :(得分:0)

您可能会采取两种不同的方法。您将从现实世界中获得大量输入,表示您缓存和保留的模型控件之外发生的事情。这部分主要是数据收集,你在这里没有丰富的域模型,因为没有不变的保护。

然后除此之外,您还将拥有一个域模型,在将这些收集的样本作为输入的情况下,计算您的发票位置。这是您丰富的模型,其位置将基于它收到的输入。因此,需要进行一定数量的编排(Bob从这份工作中报告了这些信息,我们将其写下来,现在我们将这些信息传递给域模型以便合并到职位中)。