【问题标题】:Save related entities in DDD在 DDD 中保存相关实体
【发布时间】:2015-03-07 20:11:41
【问题描述】:

我的 ICustomerService 中有以下服务操作:

public void RegisterCustomer(Customer customer)
{
    Check.NotNull(customer, "customer");

    //do another domain specific things...

    customerRepository.Save(customer);
}

编辑

Customer 类具有对 CustomerAddress 实体的 ICollection 的引用。
此操作还需要保存客户地址列表。

我知道在这种情况下进行级联更新并不是一件好事:

How should I handle persistence for referenced entities?

从 DDD 的角度来看,在这种情况下我应该怎么做?
我应该通过参数向服务操作询问客户地址列表吗?

【问题讨论】:

  • CustomerPhone 很有可能是一个值对象而不是一个实体。 CustomerPhone 真的有自己的身份和状态吗?如果您有两个具有相同编号的CustomerPhone 实例,它们不是相等且可互换的吗?如果是这种情况,那么它们应该是值对象,而不是实体。
  • @plalx,我已经编辑了我的问题。假设在这种情况下 Customer Address 不是 values 对象。我应该如何处理“SaveComplete”操作?我应该只通过参数获取实体并使用它们的引用还是获取将保存的所有相关实体?

标签: c# entity-framework repository domain-driven-design


【解决方案1】:

我知道做级联更新不是一件好事 场景:

为什么?只要 CustomerAddress 是一个简单实体而不是聚合根,您就可以通过让 EF 将它们与 Customer 一起持久化来获得一切。

从您的其他问题来看,我认为您可能会错过聚合根与实体的区别。这是你应该开始的地方——设计你的聚合,决定哪些对象应该是 AR,简单的实体和值对象。

从那里一切都应该根据一些简单的规则落实到位:每个 AR 一个存储库,实体只能引用来自同一聚合的实体,如果 AR 仅通过其 ID 引用另一个 AR 会更好,并且 VO 可以是从任何地方引用。

【讨论】:

    【解决方案2】:

    如果您询问 CustomerPhone,您可以破坏(或不?这取决于)客户对象的不变量。一种方法是使用Memento pattern。将客户的内部状态提取到 Memento 对象并将此 Memento 传递到存储库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多