【问题标题】:What should repositories in DDD returnDDD 中的存储库应该返回什么
【发布时间】:2020-04-01 16:41:05
【问题描述】:

我研究了 DDD 中的存储库,发现了太多不同的东西。每个人对存储库的看法都不一样,这让我很困惑。

我想知道:

  1. 存储库应包含哪些方法?
  2. 存储库应该明确(或更接近)返回什么?

谢谢。

【问题讨论】:

    标签: repository domain-driven-design ddd-repositories


    【解决方案1】:

    Eric Evans 在 2003 年创造了“领域驱动设计”;因此,该上下文中任何定义的正确起点是his book。他在第 6 章(“域对象的生命周期”)中定义了存储库模式。

    一个存储库将一个类型的所有对象表示为一个概念集(通常是模拟的)。它就像一个集合,除了更精细的查询能力。添加和删​​除适当类型的对象,存储库后面的机器将它们插入或从数据库中删除。

    ...

    对于需要全局访问的每种类型的对象,创建一个可以提供该类型所有对象的内存集合假象的对象。

    存储库的主要用例:给定一个键,返回正确的根实体。存储库实现充当一个模块,它隐藏了您选择的持久性策略(请参阅:Parnas 1971)。

    【讨论】:

      【解决方案2】:

      对于每个聚合根 (AR),您都应该有一个存储库。至少,存储库可能有一个void Save(Aggregate aggregate) 和一个Aggregate Get(Guid id) 方法。返回的聚合将始终完全构成。

      我有时会为特定用例添加方法,以便仅更新某些数据位。例如,void Activate(Guid id) 之类的东西。这只是为了避免处理不必要的数据。

      查询存储库通常是有问题的,因为您通常应该避免查询您的域。对于这种情况,我的建议是使用比域对象或对象图更接近数据且格式更原始的 查询机制。查询机制更有可能返回原语,例如int Count(Query.Specification specification),或者可能返回读取模型实例的列表。

      【讨论】:

        【解决方案3】:

        您是对的,存储库在不同的上下文中具有不同的含义 - 许多作者都有自己的解释。我理解他们的方式是从多个角度:

        • 它们抽象出下划线存储类型
        • 他们可以引入更接近领域模型的接口
        • 它们代表对象的集合,因此用作聚合 内存存储(相关对象的集合)
        • 它们代表相关对象的事务边界。
        • 它们不能包含重复项 - 例如集合。
        • 存储库只包含一个对象是有效的,没有 内部关系复杂

        因此,为了回答您的问题,存储库应包含与集合相关的方法,例如添加、删除、addAll、findByCriteria - 而不是保存、更新、删除。它们可以返回整个聚合或部分聚合或一些内部聚合关系 - 这取决于您的域模型和您想要表示对象的方式

        【讨论】:

          猜你喜欢
          • 2021-11-19
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多