【发布时间】:2021-10-18 11:42:04
【问题描述】:
我正在努力解决一个基本问题。该项目使用 C#,但问题很普遍。
我遵循始终有效的对象原则。作为一个示例,我有一个具有强制性属性“ProductCategory”的产品实体。允许的产品类别是用户定义的,因此是持久的(在数据库中)。
为了类型安全和更好的阅读,我为各种属性定义了值对象来封装这些类型的业务规则。所以有一个 ProductCategory 类。创建 ProductCategory 实例时,工厂方法会检查例如在创建实例之前传递给工厂的字符串的最大长度。这确保了 ProdcutCategory 的每个实例都是有效的。
像长度这样的简单参数检查非常简单直接。我的问题是在哪里对保留的可能值实施验证检查。允许值的存储库隐藏了持久性技术并具有 Exists 或 IsValid 方法。
选项 1) 在调用工厂之前从应用层调用存储库。
这里的领域层没有像许多人提倡的那样依赖于存储库/基础设施层。但是工厂不能再确保一个有效的对象了。业务规则的实现取决于应用层。此外,每个需要 ProductCategory 的命令都必须检查存储库,这违反了 DRY。
选项 2) 从值对象工厂调用存储库
由于工厂是域层的一部分,因此该层必须有权访问存储库,这会引入额外的耦合。好处是ProductCategory的业务有效性是由对象本身保证的,无法规避。
对于这种困境是否有其他解决方案,或者是否有任何特定标准可以鼓励一种或另一种选择? 如果工厂是针对存储在域层中并且仅由基础设施层中的存储库实现的存储库接口进行编程的,是否可以? 我试图理解不同的方法,但在这种情况下我感到迷茫。
【问题讨论】:
标签: c# validation domain-driven-design ddd-repositories user-defined