实现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相同的功能?或者有没有办法让没有这种依赖的富域名对象?
答案 0 :(得分:1)
这可以通过使用依赖注入来解决。这将允许您的域对象与您选择的ORM分离(加上依赖注入的所有其他好处)。关于如何在代码中分离问题,没有单一的,绝对正确的答案。
相关说明: .Add()
的行为将在EF7 - beta 8中发生变化(请参阅PR#2979)。变更跟踪器现在将包括所有&#34;孩子&#34;你打电话时的实体。添加父项。