DDD有界背景相同概念的不同模型

时间:2017-11-08 08:05:10

标签: domain-driven-design bounded-contexts

我有一个包含多个子域的ERP项目。它没有使用CQRS或域事件。

我有两个子域名; CRM和会计。客户概念需要在两个子域中以不同方式建模。 CRM需要知道公司的规模(员工人数),而不是税号。会计需要知道税号而不是大小。两个子域都需要公司名称。

我正在考虑将CRM客户和会计客户建模为实体。但是,每当CRM用户创建新客户时,还需要创建会计客户实例。如果报告需要来自两个子域的信息,那么当您拥有包含所有信息的单个实体时,查询会变得更加复杂。

这是要走的路吗?有没有更好的办法?在不使用域事件的情况下拥有多个子域是否有意义?

1 个答案:

答案 0 :(得分:3)

您确定需要DDD吗?用例看起来很简单,也许你只是遗漏了所有其他的复杂性,但从你要问的信息,一个简单的CRUD应用程序就可以了。以数据为中心的应用程序(如报告)不需要DDD。当您必须严格修改数据时,需要DDD,以保持一致性。

如果您确定需要DDD,那么您需要了解模型的重点是防止域的不变量。您说CRM客户必须始终拥有等效的会计客户。今天的业务如何处理?会计如何了解CRM客户?会计如何知道他们在谈论与CRM相同的客户?然而,他们目前正在这样做,你应该尝试建模。

作为一个例子,如果他们在现实生活中通过让另一个人知道它来做。您可以让您的CRM上下文发布新的Customer事件,并且您的会计上下文可以通过为其创建会计客户来对其做出反应。

另一方面,如果他们都从别的东西中学到它,那么也许他们都会对其他事情做出反应。

如果您不想使用事件,则可以是直接调用,从CRM上下文到会计上下文。虽然知道这会随着应用程序的增长而变得越来越受限制,但如果你再次拥有一个简单的域名,那就没问题了。

此外,查询数据与修改数据不同。查询不应使用域模型实体和值对象。它可以,但它不应受其约束。那是因为查询是一个只读操作。只有在要更改数据时,才需要将数据放入域模型中。