DDD中存储库的责任(EntityFramework)

时间:2013-01-31 05:00:07

标签: domain-driven-design

  1. 实体Foo和Bar都是聚合根
  2. Foo引用Bar
  3. SomeService执行以下操作 一个。调用FooRepository.FindId()来获取Foo的实例 湾修改Foo实例,并对Foo实例引用的Bar实例进行一些修改 C。调用FooRepository.Update(Foo)来保持对Foo实例所做的更改
  4. 问题:     1.知道Foo-> Bar,(应该)FooRepository.FindId()如何构造Foo实例和它引用的Bar实例? (假设使用了EntityFramework,并且我自动了解EntityFramework构建实体及其依赖项)     2.假设Foo实例引用了Bar实例,FooRepository.Update()是否还会保留对Bar实例所做的更改?         如果答案为否,假设Entity Framework是用于数据库访问的技术,SomeService如何告诉存储库(或EntityFramework更准确)忽略Bar的更改?

2 个答案:

答案 0 :(得分:2)

阅读Effective Aggregate Design by Vaughn Vernon之后,它让我了解了设计聚合的信息。

作为一项规则,我将以其身份引用Bar。如果要更改其boo状态,我将从BarRepository中获取它。

答案 1 :(得分:1)

  1. 正如 rantri 所指出的,不鼓励不同聚合之间的对象引用。最好使用身份参考。这是因为聚合需要是一致性边界,如果有多个聚合在起作用,则难以实施。

  2. EF应该能够更新引用的Bar实体。我知道在NHibernate中,这称为可达性持久性,可以启用或禁用。然而,这是有问题的,因为它使得更难以推断实体如何以及何时被持久化。告诉某事忽略对Bar的更改的最好方法是避免直接引用bar。通常情况下,引用类似Bar的唯一原因是出于显示目的。在这种情况下,最好使用专用的read-model而不是污染域对象。如果Foo上的行为需要Bar引用,那么最好让周围的应用程序服务提供Foo直接需要的数据。