DDD:建模M:两个根之间的关系,其中关系本身具有语义

时间:2009-03-17 14:55:26

标签: oop architecture domain-driven-design

更新已编辑,以反映以下Chris Holmes要求的说明。最初我指的是一个终端作为一个站点,但改变它以更好地反映我的实际域名。

从本质上讲,我认为这是一个关于在两个根实体之间建立多对多关系的问题,其中关系本身具有一些语义含义。

在我的域名

  • 您可以将终端视为我们公司的分支机构
  • 终端可以与任意数量的客户建立关系
  • 客户可以与任意数量的终端建立关系(标准多对多)
  • 客户\终端关系意味着客户可以在终端
  • 存储产品
  • 可以启用\禁用此关系。被禁用仅仅意味着您暂时不被允许存储产品,因此禁用的关系与根本不存在关系。
  • 客户可以拥有多个办事处
  • 与客户有关系的终端(已启用或未启用)必须为该客户提供与之通信的默认办公室
  • 有一些默认设置适用于客户和终端之间的所有交易,这些设置是在终端 - 客户关系级别设置的

我认为我的对象非常明确,终端客户 Office TerminalCustomerRelationship (从存在关于关系的信息,例如是否启用,默认办公室,广告默认设置)。通过多次重构,我已经确定终端和客户都应该是聚合根。这让我想到如何设计我的TerminalCustomerRelationship对象以将两者联系起来。

我想我可以从终端到TerminalCustomerRelationship的遍历朝向关系,但是我不知道如何打破从关系到客户的关系,特别是因为它需要包含对具有与客户的关系。

我对这些东西不熟悉,虽然大多数DDD都很有意义,但我很困惑,需要一个新的前景。有人可以就如何处理这种情况向我发表意见吗?

请注意,我说关系不是关系。在我目前的观点中,它应该成为一个对象,就像婚姻将成为婚礼教堂应用程序中的对象一样。它最明显的目的是它涉及两个对象,但它也有其他属性,它们也属于它。

3 个答案:

答案 0 :(得分:2)

根据您的描述,您肯定需要一个“ TerminalCustomerRelationship ”实体来跟踪相关信息。我还将' IsEnabled '标志转换为带有时间戳的第一类“事件”实体 - 这使您能够保存状态变化的历史记录(更真实地了解发生的情况)域名。)

这是一个sample application(在VS2008中),可以解决您的问题。您可以调整/测试代码,直到关系有意义。运行“ bin / debug / TerminalSampleApp.exe ”并右键单击“终端 - >创建示例”以开始使用。

如果您发现它有用,请告诉我。

答案 1 :(得分:1)

名称通常可以澄清对象的职责并使域模型成为焦点。

我不清楚网站是什么,这使整个模型混乱,这使我很难提供更好的建议。例如,如果站点是供应商,那么将SiteCustomerRelationship重命名为合同将很容易。在这种情况下,合同成为自己的实体是完全合理的,并且模型看起来像Vendor-Contract-Customer-Office。

还有其他方法可以看到这一点。 Udi在这种多对多关系中发表了不错的帖子here

答案 2 :(得分:0)

你不应该有像SiteCustomerRelationship这样的对象,它的数据库特定。

如果它真正的DDD你应该有一个像:

的关系
Aggregate<Site> Customer.Site
IEnumerable<Aggregate<Office>> Customer.Offices

也许

Aggregate<Office> Customer.DefaultOffice