更新已编辑,以反映以下Chris Holmes要求的说明。最初我指的是一个终端作为一个站点,但改变它以更好地反映我的实际域名。
从本质上讲,我认为这是一个关于在两个根实体之间建立多对多关系的问题,其中关系本身具有一些语义含义。
在我的域名
我认为我的对象非常明确,终端,客户, Office 和 TerminalCustomerRelationship (从存在关于关系的信息,例如是否启用,默认办公室,广告默认设置)。通过多次重构,我已经确定终端和客户都应该是聚合根。这让我想到如何设计我的TerminalCustomerRelationship对象以将两者联系起来。
我想我可以从终端到TerminalCustomerRelationship的遍历朝向关系,但是我不知道如何打破从关系到客户的关系,特别是因为它需要包含对具有与客户的关系。
我对这些东西不熟悉,虽然大多数DDD都很有意义,但我很困惑,需要一个新的前景。有人可以就如何处理这种情况向我发表意见吗?
请注意,我说关系不是关系。在我目前的观点中,它应该成为一个对象,就像婚姻将成为婚礼教堂应用程序中的对象一样。它最明显的目的是它涉及两个对象,但它也有其他属性,它们也属于它。
答案 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