【问题标题】:Reference another Aggregate Root inside another Aggregate root?在另一个聚合根中引用另一个聚合根?
【发布时间】:2013-07-10 19:15:46
【问题描述】:

我已经完成 DDD 几年了,但在设计聚合方面仍然充满挑战。这就是 DDD 的有趣部分,它让你头晕目眩。我问这个问题是因为我是一个项目的架构师,我们正在设计模型。当模型与 GUI 并行发展并与客户一起收集需求时,它是一个迭代。 现在来解决问题。我们的场景是我们正面临一些正在成长为非常大的 AR 的聚合。我认为我擅长寻找 Value 对象并避免贫血的领域模型陷阱。但我从来没有遇到过这种情况。 一个例子是我们的系统应该代表一个移动电信天线。天线位于绿色区域。但是天线可以有一个带有设备的庇护所。天线可以有微波链路,可以有地面光纤线,可以有无线电元件,可以有电源。面对它。如果 Antenna 被终止......所有这些依赖关系也会被删除。因为它们是安装的一部分(绿色区域除外 :)) 但你明白了。天线模型很复杂……而且大型 AR 在并发锁、性能、内存消耗方面不灵活。

在阅读了 Vaughn Vernons 关于有效 AR 设计http://dddcommunity.org/library/vernon_2011/ 的非常好的论文后,我意识到我们需要开始将我们的大型 AR 分成几块。

我的想法是像 Vernon 建议的那样去做,例如将 MicrowaveLinks 移出到单独的 AR(即使它不在现实中)。 MicrowaveLink 实体,现在是 AR,是 Id 的参考天线。在 MicrowaveLink 实体类中,我们有一个值对象属性,即 AntennaId。 我们的用例支持这种情况。我们很少将天线和链接一起列出。因此可以通过 MicrowaveLinkRepository.ListByAntenna(Guid antennaId) 加载 MicrowaveLinks

1) 你之前做过这个 AR 拆分吗?你是怎么做的? 2) 您是否设法通过域约束和 DB(我们使用 EF 5 作为 ORM)来支持这种 AR --> AR 关系完好无损?

我的最佳目标是能够在 Antenna 上跳过 Antenna.Microwaves 集合。所以天线不知道是否有链接。链接知道它们安装在什么天线上。 在 MicrowaveLink 实体中,我只想要一个 AntennaId 属性,并希望有一个确保 Antenna 存在的 DB 约束。

我知道我可以通过 T-SQL 脚本直接在 EF 或 DB 中的 Seed 方法中手动添加 FK 约束。但是 EF5 Code First Fluent 映射能否以某种方式支持这种关系?

【问题讨论】:

    标签: entity-framework domain-driven-design aggregation aggregateroot


    【解决方案1】:

    听起来你有一个Installation AR。当需要另一个 AR 时,您应该将包含的 AR 建模为容器中的唯一 ID,或者如果需要,则为 VO。

    您的 AR 周围需要有硬边。

    回到Order / OrderLine 例子:)

    OrderLine 似乎“需要”一个 Product,但您永远不应该给一个 Product 实例,呃 OrderLine。而是仅将ProductNameProductId 建模为OrderLine 中的VO。现在你的Order AR 有了明显的优势。

    希望能有所帮助。

    【讨论】:

    • 这就是我的模型现在的样子。在我的模型中安装是“站点”,我通过微波端的 VO 对象将微波链接与站点分开。所以 MicrowaveLink.LinkedSite 属性是一个包含 SiteId 和 SiteName 的 VO。只是好奇您是否有这样做的“现场”经验以及结果如何?据我所知,EF 不支持这种关系,在这种关系中,您只表达这种没有导航属性的一对多关系......只是一侧的 VO。
    • 恐怕我没有EF经验。我不是特别喜欢 ORM :) --- 但至于应用 DDD 技术的成功我不能抱怨。
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2018-11-08
    • 1970-01-01
    • 2017-08-25
    • 2019-02-13
    • 2015-02-13
    相关资源
    最近更新 更多