存储库模式x不匹配的业务对象

时间:2017-01-06 12:03:27

标签: design-patterns architecture domain-driven-design cqrs ddd-repositories

我很清楚为什么以及如何使用存储库,这同样适用于查询对象,只要您需要(例如,完全反映数据库中的内容的对象),它们似乎都很容易理解。

但是我似乎无法理解那些正好适合我正在建造的特定结构的物体。

我有产品和类别,他们都有自己的存储库。

我的类别存在于自引用的父子结构中。

我的产品属于没有子类别的类别。

现在我需要提取这些数据来组合一个菜单,如下所示:

数据:

  • 厨房(类别)
    • 餐具(类别)
      • 刀具(类别)
        • 3件套刀具(产品)
      • 勺子(类别)
        • 3件套汤匙(产品)
      • 电器设备
        • 咖啡机(类别)
          • Nespresso咖啡机(产品)
          • 浓缩咖啡机(产品
        • 搅拌机(类别)
          • 冰沙搅拌机(产品)

然后我需要一个菜单​​,就像这样:

  • Kitchen(这将是查看其所有子类别的链接)
    • 3件套刀具(这将直接链接到产品页面)
    • Nespresso咖啡机
    • 冰沙搅拌机
  • 另一类别
    • 另一种产品1
    • 另一种产品2
    • 另一种产品3

这将是供应商在我们的市场中拥有产品的所有顶级类别的列表,其中随机选择的产品列表属于该顶级类别,无论类别级别如何。

一切都很好,我完成了所有工作。 现在我只想了解这种结构在一个架构中的位置,该架构的存储库基本上每个表包含一个对象。

如何匹配我的存储库,它将原始数据镜像到完全不同的业务对象中?

如果有人能指出我要解决这个问题的好文章,那就太好了。

1 个答案:

答案 0 :(得分:1)

存储库模式出现在DDD的背景下,阅读的最佳书籍将是原始的Domain-Driven Design: Tackling Complexity in the Heart of Software

埃文斯一遍又一遍地说的一件事是,域名的所有概念都必须是明确的。

您的菜单代表什么? 它是否在域中有名称?

让我们说它确实如此,并且它是"每周推广产品的概念"然后你可以使这个概念明确 - 并为此引入一个单独的类,具有可以读取数据的单独存储库从产品表,从类别表中提出推广产品列表。

请注意,根据Evans的说法,我们的域和持久性模型不必匹配,我们不需要为每个域对象设置一个存储库(具体来说,我们应该具有存储库对于聚合根,引用所有其他实体应该通过遍历聚合根的关联获得

或者,在设计中,有点偏离DDD,您可以将选定的促销产品放在产品库中,预先加载类别,并在产品上只有一个TopCategory计算属性

请注意,如果新实体"促销产品"纯粹是虚拟的,你计划进行读取操作,而不改变其状态,那么应用Command Query Responsibility Seggregation很有意义,并为&#设置一个单独的读取模型34;推广产品"在您的主域模型之外。