域驱动设计 - 聚合根设计问题

时间:2011-12-20 18:44:49

标签: architecture domain-driven-design aggregateroot

我目前正在重构一个系统。

我遇到以下情况:

该系统旨在提供有关多个业务部门的公司的信息。 每个公司都可以在一个或多个部门中活跃。公司可以参与某些合作伙伴计划。公司可以拥有一个或多个合作伙伴制造商(例如车库可以与宝马/梅赛德斯合作)等。所有这些参与都存在给定的时间段(有效期)。此外,像宝马这样的制造商必然会涉及一个商业领域。因此,如果宝马对公司业务部门有效,那么公司只能成为宝马的合作伙伴。也就是说,因为该系统不仅仅维护商业部门的公司,如车库,还包括拖车服务等。

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

公司 - >作业(不是慢慢变化) - >商业部门

公司 - >伙伴关系(日期从 - 到) - >组织< - 商业部门

公司和组织必须共享相同的业务部门。

现在,人们可以改变一个组织的商业部门的分配。那么这就是让同一个商业部门无效的规则。

你会如何模仿这样的东西?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

你的解释出了问题。此设计中没有聚合根。

但从逻辑上讲,以下陈述可能会发生冲突

  像宝马这样的制造商必然会涉及一个商业领域(1)

  

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

如果他们这样做,你必须避免其中一个。

如果(2)是假的,那么一切都很好,对吧?你只是不允许这样的改变。

如果(1)是假的(或者更确切地说,不是那么严格),那么与商业部门的组织界限也应该限制在一定的时间段内。在这种情况下,您可以像伙伴关系的期限一样以同样的方式进行。

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

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

希望有所帮助。 (实际上,通用设计问题应该发送到programmers网站。)