【问题标题】:Domain driven design child entities change tracking领域驱动设计子实体变更跟踪
【发布时间】:2013-05-15 10:58:51
【问题描述】:

我在弄清楚聚合根如何跟踪子实体的更改时遇到了一些困难。

假设我有一个聚合:

  • 顺序(根)
  • OrderLineItem

Order 类是聚合根。我将如何通过Order 类跟踪对每个OrderLineItem 所做的更改?

当我创建一个存储库(实施)例如一个OrderRepository(因为只有聚合根才能拥有存储库对吗?),我的OrderRepository将如何跟踪每个OrderLineItem的变化?

例子:

  • 新添加但未提交到 DB
  • 已编辑但已提交给 DB
  • 已编辑但未提交给 DB

你们是怎么处理这个问题的?

【问题讨论】:

    标签: oop domain-driven-design repository-pattern domain-model aggregateroot


    【解决方案1】:

    现在 Order 类是聚合根,我将如何跟踪 通过 Order 类对每个 OrderLineItem 进行了更改?

    Order 聚合的所有更改,包括OrderLineItem,都应通过聚合根。这样,聚合可以保持其完整性。至于跟踪更改,这取决于您的持久性实现。如果使用诸如 EF 或 NHibernate 之类的 ORM,那么 ORM 将负责跟踪更改。如果使用事件溯源,则更改将作为一系列事件显式跟踪,通常由 OOP 实现中的聚合维护。如果直接使用 SQL,您还可以避免跟踪更改并在每次提交时更新整个聚合。

    当我创建一个存储库(实现)时说 OrderRepository 因为 只有聚合根才能拥有存储库吗?

    是的,每个聚合的存储库。

    【讨论】:

    • 嗨.. eulerfx.. 谢谢.. 虽然我的域模型与我的 EF 实体不同.. 我在数据访问层中进行了一些映射.. 将我的域中的类映射到我的 EF 实体。 .example:SalesTransaction(域模型中的类),SpecialTransaction(域模型中的类)但在 DAL 中它只是一个事务(EF 实体)..我就是这样做的,所以我无法跟踪我的域实体,因为它的持久性无知(不知道谁在实现存储库接口).. 那么我如何跟踪更改?因为上层使用领域实体。
    • 为什么不将 EF 直接映射到域对象?
    • im 在我的 ef 中使用模型 1st 我不使用代码 1st...我创建了将域对象映射到 ef 实体的类..
    • 如果您正在处理两个类层次结构,另一种跟踪更改的方法是在域对象和相应的持久性对象之间进行比较。我相信 EF 可以在幕后做类似的事情。
    猜你喜欢
    • 2011-08-01
    • 2020-10-26
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2011-01-30
    • 2015-04-22
    • 2011-01-05
    • 2010-10-05
    相关资源
    最近更新 更多