【发布时间】:2015-07-26 16:14:20
【问题描述】:
我有一个名为 Account 的聚合根和一个名为 Contact 的实体,可以通过根上的方法访问:Account.GetContactById(string id)。对聚合根的访问是通过存储库进行的,因此从存储中获取帐户的数据访问逻辑驻留在那里。
访问Contact 实体的数据访问逻辑应该驻留在哪里?我看到的大多数示例都会显示 Account.GetContactById 方法搜索内存中的集合。就我而言,Account 可以引用数千个 Contacts,我不想将它们预取到内存中。因此,鉴于调用该方法时需要访问数据存储,我是否在以下位置实现该访问:
-
Account.GetContactById方法?这将直接访问存储库之外的存储,并引入一些紧密耦合。 -
AccountRepository,所以它可以被Account聚合调用?这似乎会将Contact实体直接暴露给存储库的任何其他用户,这违反了 Evans 的规则。 - 另一个存储库,例如
ContactRepository?在这种情况下,我有一个不是聚合根的实体的存储库。 - 其他?
【问题讨论】:
-
为什么
Contact不是它自己的聚合根?您为什么决定使用大型集群Account聚合? -
@plalx 好点。我的困境可能只是一个糟糕的建模决定的产物。我会再考虑一下。
-
通常,如果没有要强制执行的不变量,例如最大联系人数量等,那么
Contact可能是一个 AR,因为通过将它们聚集在Account中您将一无所获。跨度> -
@plalx 您的建议使我找到了正确的解决方案。我想给你一些信任,所以如果你想把它作为答案发布,我会接受它并用我的解决方案细节添加 cmets。
标签: domain-driven-design aggregateroot