【问题标题】:Single repository vs Multiple Repositories for multiple tables in Domain Driven Design [closed]域驱动设计中多个表的单个存储库与多个存储库[关闭]
【发布时间】:2018-11-27 04:43:32
【问题描述】:

我有两张表来获取标准订阅者与高级订阅者的计费费率,即 StandardRate 与 PremiumRates。这些值由产品经理填充。

表访问是通过 ORM 控制的,即 StandardRateOrm 和 PremiumRateOrm。我正在尝试设计一个存储库来访问 ORM 并根据某些标准检索费率。例如,用户的邮政编码范围。

我无法具体设计是否需要两个存储库类与单个存储库类。

选项 1: 我知道存储库隐藏了 DDD 中的存储层,因此只有一个名为 RateRepository 的存储库足以访问任一 ORM 并返回结果。目前,结果是值对象,因为它是只读访问。

选项 2: 但是,在考虑 SOLID 原则时 (https://en.wikipedia.org/wiki/SOLID)。创建一个名为 RateRepository 的父类和两个子存储库类(StandardRateRepository 和 PremiumRateRepository)是有意义的,它们分别访问其相应的 ORM,因为它遵守:

  1. 单一职责:存储库只有一个理由 改变。
  2. 打开/关闭
  3. 接口隔离

使用选项1,感觉界面不干净,也不符合SOLID原则。使用选项 2,感觉就像是在域层中暴露了存储细节。

是否有任何已知的设计模式/规则可以解决这个问题?

【问题讨论】:

  • 什么代码使用这些Value对象?

标签: oop domain-driven-design repository-pattern solid-principles


【解决方案1】:

不看领域实体图很难给出好的答案。

通常费率是值对象,因为费率通常由它们的值而不是身份定义。例如:任何一美元钞票都是一美元钞票。仅仅因为费率可以保持不变,并不一定意味着他们需要一个存储库。存储库通常用于处理聚合根实体。

即使您的域中的汇率是实体,也应该使用功能强大的 ORM 或自定义数据映射器从对象模型中抽象出数据库详细信息(不同汇率的单独表)。

【讨论】:

  • 同意。比率极不可能是一个实体 - 似乎更像是模型中某些概念中缺少的值对象。谁提供费率?它是发布者、提供者等吗?将其建模为聚合根,然后它可以发出 Rate 作为其业务逻辑的一部分。
猜你喜欢
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2011-09-12
  • 2013-01-20
相关资源
最近更新 更多