【问题标题】:DDD: Getting aggregate roots for other aggregatesDDD:获取其他聚合的聚合根
【发布时间】:2011-01-16 18:26:18
【问题描述】:

过去 2 周我一直在研究 DDD,其中一件真正让我印象深刻的事情是聚合根如何包含其他聚合根。聚合根是从存储库中检索的,但如果一个根包含另一个根,存储库是否有对另一个存储库的引用并要求它构建子根?

【问题讨论】:

  • 是领域驱动设计吗?你看过复合设计模式吗?

标签: domain-driven-design repository-pattern aggregateroot


【解决方案1】:

@Paco:你错了。存储库不仅用于存储对象。如果您阅读过 Eric Evan 的 DDD 书,您就会知道存储库就像是面向对象的内存中数据表示。您可以像使用 Collection 一样使用 Repository 对象。可以使用 indexer 获取或设置对象,可以使用 Add() 方法添加新对象,可以使用 Remove() 方法删除对象等。

然后,存储库使用基础架构从/向数据库读取/写入数据。它可以使用 DataMapper 来简化从关系数据库中检索数据并映射到实体。

【讨论】:

    【解决方案2】:

    存储库不会构建,但会存储。使用 ddd 时,您可能想熟悉基本的持久性模式,例如工作单元、身份映射、延迟加载、对象关系映射器、查询对象、(动态)代理。 (这些模式与 ddd 无关,但了解起来非常有用)。存储库只是一个门面,用于隐藏前面提到的模式的实现并以域驱动的方式抽象数据访问。现在大多数人不会手动编写他们的持久化基础设施,尤其是在使用 ddd 时,您可能希望查看一个 orm。

    将数据库记录转换为对象的代码的实际引用将在数据映射器中。 mappingclasses 本身的映射类之间会有引用,或者由类似 mapperfactory 的东西创建。

    public interface IDataMapper<T>
    {
       T Map(IDataReader reader);
    }
    

    您不必自己实现此代码,只需使用为您执行此操作的工具并尝试了解该工具 (orm) 中的部分代码是如何工作的。如果没有一套好的工具可以让您免于编写大量代码,那么没有任何 orm 的纯 ddd 几乎是不可能的。

    【讨论】:

      【解决方案3】:

      在我看来,这取决于 - 我有相同的场景,我处理这个问题的方式是通过我正在使用的 ORM - nHibernate。

      我的所有实体都有映射,其中有几个是聚合根,其中一个有几个其他聚合根作为成员变量。这个复合聚合根的存储库不需要引用其他聚合根存储库,因为 nHibernate 知道如何获取所有需要的数据(通过映射)。

      HTH

      AWC

      【讨论】:

        猜你喜欢
        • 2016-03-21
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多