【问题标题】:DDD - Restricting repository to create only certain entityDDD - 限制存储库仅创建特定实体
【发布时间】:2014-06-23 23:01:42
【问题描述】:

我有一个关于存储库和实体的重要问题。我是否应该限制存储库以创建特定的实体/聚合根(通过 BaseRepository 等通用存储库)?

此时,基础存储库可以访问数据库工厂对象(不是 DbFactory,而是自定义)以检索任何 POCO(不仅与聚合根相关)。因此,从技术上讲,我可以从任何存储库创建任何实体。显然,作为一名程序员,我不这样做,但这绝对是可能的。那么,是否有必要限制存储库并允许它创建特定实体?请注意,某些实体也有子实体。那么,如果我限制存储库创建一个实体(通过 BaseRepository),那么如何创建子实体?

【问题讨论】:

  • 您的意思是“创建”,如在系统中引入新实体/聚合根或重新水化先前存储的实体? “用于检索任何 POCO 的数据库工厂对象” 部分使其非常不清楚。

标签: c# domain-driven-design ddd-repositories


【解决方案1】:

正如@Jonas 在他的回答中所建议的那样,我会为每个聚合根创建一个存储库。这些应该隐藏所有持久性细节。这意味着将域实体作为参数并返回域实体。通常从 ORM 实体映射到存储库中的域实体。作为副作用,这也让您考虑需要哪些数据,从而减少在 DDD 处理具有延迟加载属性的实体时可能遇到的一些问题。

我会避免通用存储库模式,就像您在原始帖子中所说的那样,在 DDD 中您希望您的代码记录您的设计意图,您不想提供允许客户端的代码/callers 从您的数据库中加载任何实体。此外,您的大多数实体很可能是从 许多 表/资源构建的,这不适用于通用存储库模式。

【讨论】:

【解决方案2】:

我认为在有界上下文中为每个聚合根都有一个存储库是很清楚的。

这将使您的应用程序中的聚合根与什么是(子)实体更明显。通过这种方式,您可以保护自己和他人免于损害通过存储库访问和使用聚合的方式。

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 2013-12-05
    • 2010-11-24
    • 2012-01-27
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多