2011-12-20 64 views
0

我目前正在重构一个系统。域驱动设计 - 总根设计问题

我有以下情况:

系统即将在多个业务部门提供有关公司的信息。 每个公司都可以在一个或多个行业活跃。公司可以参与某些合作伙伴计划。一家公司可以有一个或多个合作伙伴制造商(例如,一个车库可以与宝马/奔驰有合作关系)等等。所有这些参与都存在一定的时间段(有效期)。此外,像宝马这样的制造商必然会有一个业务部门。因此,如果宝马适用于公司商业部门,公司只能成为宝马的合作伙伴。也就是说,因为系统不仅仅是维护一个商业部门的公司,而且还包括拖车服务等。

所以现在我的设计可以导致一些不变量。

公司 - >分配(不慢慢改变) - >商务部门

公司 - >合作伙伴(日期从 - 到) - >组织< - 业务部门

凡公司和组织必须共享相同的商业部门分配。

所以现在可以改变一个组织的商业部门分配。那么这将有相同的商业部门是无效的规则。

你会如何模型?

+0

我怀疑这些都是真的不变量。 – 2011-12-25 19:52:56

回答

0

你的解释出了点问题。这种设计中没有聚合根源。

但逻辑上可能是下面的语句冲突

制造商如宝马被绑定到一个业务部门(1)

一个可以改变的业务部门分配一个组织(2)

如果他们这样做,你必须避免其中之一。如果(2)是假的,那么一切都很好,对不对?你只是不允许这样的改变。如果(1)是虚假的(或者更确切地说,没有那么严格),那么与商业部门的组织边界也应限制在一定的时间段内。在这种情况下,您可以像合伙企业的期限那样采用相同的方式。

例如,您可以将Partnership.EndDate设置为Organization-> Sector链接更改的日期。

此外,您可以保留部分组织参与的历史清单。业务规则将强制执行与合作伙伴关系和部门分配相匹配的时间段。

希望有所帮助。 (实际上一般的设计问题应该去programmers网站。)

2

我看到强制执行本业务规则的2兼容DDD-方式:

  • DDD specifies,在一个聚合不变量应该由聚合根执行。如果公司是你的总根,当你添加一个新的合作伙伴关系,它可以检查是否合作与工商界规则的规定(可能使用Specification模式:EligibleForPartnershipSpecification例如)

  • 当改变组织的业务部门,根据"can the operation be performed ?" rather than "is this entity valid ?"来思考是个好主意。这可能意味着检查公司存储库中的公司是否具有合作伙伴关系,该伙伴关系在修改后会变得不一致,并相应地决定如何执行(可能基于策略/策略模式)。

合同是执行不变量的另一种聪明的办法:看http://msdn.microsoft.com/en-us/magazine/hh205755.aspx(.NET)