存储库模式 x 不匹配的业务对象
repository pattern x non matching business object
我很清楚为什么以及如何使用存储库,这同样适用于查询对象,只要您需要,它们似乎都很容易理解,例如,准确反映数据库中内容的对象。
但我似乎无法理解我现在正在构建的一个非常具体的结构的确切位置。
我有产品和类别,它们都有自己的存储库。
我的类别存在于自引用父子结构中。
我有属于没有子类别的类别的产品。
现在我需要提取这些数据来组合一个如下所示的菜单:
数据:
- 厨房(类别)
- 餐具(类别)
- 刀具(类别)
- 刀具三件套(产品)
- 勺子(类别)
- 勺子三件套(产品)
- 家电
- 咖啡机(类别)
- Nespresso 咖啡机(产品)
- 浓缩咖啡机(产品
- 搅拌机(类别)
- 冰沙搅拌机(产品)
那我需要一个菜单,应该是这样的:
- 厨房(这将是 link 以查看其所有子类别)
- 3 件套刀具(这将 link 直接转到产品页面)
- 奈斯派索咖啡机
- 冰沙搅拌机
- 另一个类别
- 另一个产品 1
- 另一个产品 2
- 另一个产品 3
这将是供应商在我们的市场中拥有产品的所有顶级类别的列表,以及随机选择的顶级类别下的产品列表,无论类别级别如何。
很好,我已经完成了所有工作。
现在我只是想了解这种结构在架构中的什么位置,该架构的存储库基本上每个 table.
包含一个对象
如何匹配将原始数据镜像到完全不同的业务对象的存储库?
如果有人能给我指出一篇解决这个问题的好文章,那就太好了。
存储库模式出现在 DDD 的上下文中,最好的阅读书籍是原始的 Domain-Driven Design: Tackling Complexity in the Heart of Software
埃文斯一遍又一遍地说的一件事是领域的所有概念都必须明确。
你的菜单代表什么?
它在域中有名称吗?
假设是这样,它是 "weekly promoted products" 的概念,那么您可以明确这个概念 - 并为此引入一个单独的 class,带有一个单独的存储库,可以阅读来自产品 table 和类别 table 的数据,以得出促销产品列表。
请注意,根据 Evans,我们的域模型和持久性模型不必匹配,我们不需要为每个域对象创建一个存储库(具体来说,我们应该 仅 有聚合根的存储库,所有其他实体的引用应该通过从聚合根遍历关联来获得)
或者,在某种程度上偏离 DDD 的设计中,您可以将那些促销产品的选择放在产品存储库中,预加载类别,然后只对产品进行 TopCategory 计算 属性
请注意,如果新实体 "promoted products" 是纯虚拟的,并且您 仅 计划进行读取操作,而不改变其状态,那么它会使应用 Command Query Responsibility Seggregation 并在主域模型之外为 "promoted products" 设置单独的读取模型非常有意义。
我很清楚为什么以及如何使用存储库,这同样适用于查询对象,只要您需要,它们似乎都很容易理解,例如,准确反映数据库中内容的对象。
但我似乎无法理解我现在正在构建的一个非常具体的结构的确切位置。
我有产品和类别,它们都有自己的存储库。
我的类别存在于自引用父子结构中。
我有属于没有子类别的类别的产品。
现在我需要提取这些数据来组合一个如下所示的菜单:
数据:
- 厨房(类别)
- 餐具(类别)
- 刀具(类别)
- 刀具三件套(产品)
- 勺子(类别)
- 勺子三件套(产品)
- 家电
- 咖啡机(类别)
- Nespresso 咖啡机(产品)
- 浓缩咖啡机(产品
- 搅拌机(类别)
- 冰沙搅拌机(产品)
- 咖啡机(类别)
- 刀具(类别)
- 餐具(类别)
那我需要一个菜单,应该是这样的:
- 厨房(这将是 link 以查看其所有子类别)
- 3 件套刀具(这将 link 直接转到产品页面)
- 奈斯派索咖啡机
- 冰沙搅拌机
- 另一个类别
- 另一个产品 1
- 另一个产品 2
- 另一个产品 3
这将是供应商在我们的市场中拥有产品的所有顶级类别的列表,以及随机选择的顶级类别下的产品列表,无论类别级别如何。
很好,我已经完成了所有工作。 现在我只是想了解这种结构在架构中的什么位置,该架构的存储库基本上每个 table.
包含一个对象如何匹配将原始数据镜像到完全不同的业务对象的存储库?
如果有人能给我指出一篇解决这个问题的好文章,那就太好了。
存储库模式出现在 DDD 的上下文中,最好的阅读书籍是原始的 Domain-Driven Design: Tackling Complexity in the Heart of Software
埃文斯一遍又一遍地说的一件事是领域的所有概念都必须明确。
你的菜单代表什么? 它在域中有名称吗?
假设是这样,它是 "weekly promoted products" 的概念,那么您可以明确这个概念 - 并为此引入一个单独的 class,带有一个单独的存储库,可以阅读来自产品 table 和类别 table 的数据,以得出促销产品列表。
请注意,根据 Evans,我们的域模型和持久性模型不必匹配,我们不需要为每个域对象创建一个存储库(具体来说,我们应该 仅 有聚合根的存储库,所有其他实体的引用应该通过从聚合根遍历关联来获得)
或者,在某种程度上偏离 DDD 的设计中,您可以将那些促销产品的选择放在产品存储库中,预加载类别,然后只对产品进行 TopCategory 计算 属性
请注意,如果新实体 "promoted products" 是纯虚拟的,并且您 仅 计划进行读取操作,而不改变其状态,那么它会使应用 Command Query Responsibility Seggregation 并在主域模型之外为 "promoted products" 设置单独的读取模型非常有意义。