【问题标题】:Identifying the aggregate roots识别聚合根
【发布时间】:2011-07-12 00:41:18
【问题描述】:

http://i51.tinypic.com/2ueqidt.jpg

让我们假设以下关系(图表)。 FundCompany 有资金和账户。还有一个 FundAccount,它在 Accounts 和 Funds 之间创建多对多关系(以及关系级别的其他属性)。最后,一个帐户有一个或多个受益人。

FundCompany 是一个聚合根,因为它位于金字塔的顶部。没有 FundCompany,Account 和 Fund 都不能存在。 FundAccount 不能同时存在 Fund 和 Account;这会使它们都聚合根吗?还是 Fund 仍然是唯一的聚合根,必须通过它才能对 FundAccount 实体执行操作?账户也有受益人,没有账户就不能存在,这是否也表明账户是聚合根?

此图上的所有实体都需要在我的应用程序中进行 CRUD 操作和屏幕。我提出这个的原因是大多数情况下每个 UI 屏幕都会存储它所引用的行/实体的 ID。因此,例如,用户在资金表上单击“详细信息”,我可能需要通过其 ID 检索资金。我的理解是,如果一个实体需要直接访问,那么它本身就是一个聚合根。然而,这会使很多实体默认聚合根。

根据上述问题的答案,我必须将这些操作映射到适当的聚合根存储库。

【问题讨论】:

    标签: .net asp.net nhibernate entity-framework domain-driven-design


    【解决方案1】:

    整个图表是单个聚合 = 它具有单个聚合根 - 顶级 FundFamily。如果FundAccount 没有FundFamily 就无法生存,那么它们就不能是聚合根。

    【讨论】:

    • 我只发布了我模型的一小部分作为示例。然而,看看我的模型,我可能有 100 个实体,所有实体都从 FundFamily 作为整个图的所有者分支下来,树在某些地方可能有 5 层深。除了简单的“没有它,它下面的一切都不能存在”之外,识别聚合根还必须有更多的东西。否则我的 100 多个实体的整个模型将折叠为 1 个服务/存储库?
    • 如果由于无法保存部分数据而必须一次性定义所有实体,您将如何在 UI 中定义此类图形?
    • 另外,假设 FundFamily 是整个图上唯一的聚合根,我将如何为这些实体中的每一个编写“通过 id 获取”方法?
    • 我不确定你的意思,我们在谈论通常所说的“删除测试”。这意味着如果您必须删除 FundFamily,您将在我的图表中删除大约 100 个实体。这有点像在说 PlanetEarth 下可能有一百万个实体,但如果没有它的存在,我们就都消失了。那么PlannetEarth 是地球上所有事物的唯一聚合根吗?
    • 在这种情况下,您建议数据层和业务层采用什么组织/模式?我正在使用实体框架作为 ORM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2017-08-21
    • 2017-11-28
    相关资源
    最近更新 更多