如何实现DDD聚合而不依赖于持久层

时间:2015-09-14 02:08:19

标签: entity-framework-core

实现DDD聚合时,我通常会让它们公开表示业务功能的方法,然后这些函数负责修改内部状态。 E.g。

public class Order
{
     public int Id { get; private set; }
     public IEnumerable<LineItem> LineItems { get; private set; }

     public void AddLineItem(...) {...}
     public void Ship() {...}
     public void Cancel() {...}
}

当使用EF6或NHibernate时,这很有效,因为上下文/会话可以检测子实体的所有插入/删除/更新。但是,对于EF7,我需要明确指示更改跟踪器有关此类更改。例如。当AddLineItem()向LineItems集合添加新订单项时,我们必须手动将其添加到上下文中的DBSet,或通知更改跟踪器该订单项的状态为Added

这意味着我的域对象必须具有对Entity Framework的显式依赖,现在我必须在调用业务函数时以某种方式传递对上下文(或更改跟踪器)的引用。

这是我应该简单解决的问题,因为EF7最终将具有与EF6 / NHibernate相同的功能?或者有没有办法让没有这种依赖的富域名对象?

1 个答案:

答案 0 :(得分:1)

这可以通过使用依赖注入来解决。这将允许您的域对象与您选择的ORM分离(加上依赖注入的所有其他好处)。关于如何在代码中分离问题,没有单一的,绝对正确的答案。

相关说明: .Add()的行为将在EF7 - beta 8中发生变化(请参阅PR#2979)。变更跟踪器现在将包括所有&#34;孩子&#34;你打电话时的实体。添加父项。