【问题标题】:RavenDB - When I do want a reference to another Root AggregateRavenDB - 当我确实想要引用另一个根聚合时
【发布时间】:2011-11-22 23:47:12
【问题描述】:

我已经使用 DDD 一段时间了,所以我对聚合的想法很满意。起初,我确实在不使用/保留对其他根聚合的引用时遇到了麻烦,但我认为我已经加入了......所以:

  • 将根聚合存储为一个文档....检查
  • 使用包含不改变或很少改变的属性的非规范化引用......检查

如果我确实希望获得对另一个根聚合的完整引用,我知道建议我保留对其 ID 的引用,并且可以使用 RavenDB 客户端 API 的 Includes 来检索所有实体都有效。

处理数据部分,我没有看到的是在我的实体类中处理这个的最好方法:

  1. 在我的类中使用 Product 上的 [JsonIgnore] 具有 ProductProductId 属性以确保它不会与文档一起保存。
    • 然后可以在存储库中将完整的对象图重新粘合在一起(使用 API 的 Includes 以提高效率)或者我可以将服务注入将获取 Product 的实体懒惰(可能 N+1 次命中)
  2. 在 ViewModel 中将其重新粘合在一起。我不喜欢这个想法,因为如果使用不当,我可能会在域中出现意外的 NULL 引用。
  3. 其他一些我没有看到的明显方式?

想法?

【问题讨论】:

    标签: c# ravendb


    【解决方案1】:

    在 DDD 中至少有两个有效的观点。一些 ppl 链接根仅按 ID 或另一个有效键聚合,其次是使用平台特定的对其他对象的引用。两者各有优缺点。

    对于像 RavenDb 这样的 NoSql 解决方案,使用第一种方法可能更好,因为第二种方法在技术上是错误的。

    【讨论】:

      【解决方案2】:

      您在这里明确反对推荐的设计,为什么您希望 Product 属性引用另一个聚合?它给了你什么?

      【讨论】:

      • 使用 Product 是一个不好的例子,因为您在许多关于何时非规范化的例子中都使用了它。在 RavenDB 神话文档(我意识到它仍然是草稿)中,提供了客户的“LastLogin”(2.1.4 - 非规范化内容)的示例。 “如果您确实需要完整的关联文档,则需要显式加载它”。我同意很难想到实际上需要这样做的时候。正如您在我的问题中所看到的那样,当我确实认为我需要(作为边缘案例)时,我正在就什么是执行此操作(显式加载)的好方法征求意见。
      猜你喜欢
      • 2013-07-10
      • 2014-04-13
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多