DDD与其他字段的多对多关系

时间:2015-04-07 04:34:27

标签: c# nhibernate domain-driven-design

我有一个名为Organisation的模型,另一个名为Account

Organisation是用于创建新Account

的聚合根

Organisation至少有一个Account Organisation至少有一个Account是所有者

Account需要属于至少一个Organisation Account需要拥有至少一个Organisation

所以我想介绍一个名为OrganisationAccount

的模型

OrganisationAccount会保留与Accounts相关联的所有Organisation,并跟踪其中一个是否为所有者。

这是一个糟糕的设计吗?什么是更好的方法?网上有一些文章表明,与DDD的多对多关系可能非常糟糕。

IEnumerable<Account>模型中维护两个Organisation属性会更好吗?

1 个答案:

答案 0 :(得分:2)

在没有Account的情况下处理Organisation是否有意义?如果是,那么Organisation不应该是包含Account的聚合的根。您说Account需要属于至少一个Organisation;它可以属于多个吗?如果是,则它不能是Organisation聚合的成员。现在听起来就像AccountOrganisation只是两个独立的相关实体。

您可能需要更加努力地发现在这里工作的基础域概念;我试图通过挑战你的模型,充分了解OrganisationAccount之间的关系。 Organisation可以更改所有者吗? Account可以更改Organizations吗?属于Account的每个Organisation都可以拥有它吗?一个Account可以拥有Organisation的“份额”吗?

对我来说,你设计中的大气味是OrganisationAccount之间的相互依赖关系。这种关系是非常对称的,它告诉我一个不应该是包含另一个的聚合的根。实际上,根据您的措辞,填充空Universe的唯一有效方法是在完全相同的时间创建OrganisationAccount,并且已经相互关联。如果他们真正属于同一个聚合,那就没关系,但是唯一访问Account的方法必须是问Organization OwnersGuests。 .. Account(?)是;除Organization聚合的成员外,任何人都不得拥有对Account的引用!这使得OrganisationAccount无法与多个组织相关联(因为一个组织将持有对属于另一个组织的帐户的引用)。

Partnership是域专家熟悉的术语吗?它听起来像是数据库中关联表的名称,但是你应该避免让这样的单词进入你无处不在的语言,除非它们对模型有用。我想到的一个词是OrganizationAccount之间的Ownership,听起来至少有几种不同的伙伴关系:一种暗示{{1}而一个简单暗示Membership。如果我在你的位置,我会向我的领域专家建议Partnership一词,不是因为我认为这是正确的,而是因为我想仔细聆听他们不可避免的“好吧,这不是真正的伙伴关系,它是更像是[模型演变的下一步]。“