如何在不依赖于持久层的情况下实现DDD聚合?



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

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

这意味着我的域对象必须显式地依赖于实体框架,并且在调用业务函数时,我现在必须以某种方式传递对上下文(或更改跟踪器)的引用。

在EF7最终将具有与EF6/NHibernate相同的功能的基础上,这是我应该暂时解决的问题吗?或者有没有一种方法可以让富域对象不依赖于这种依赖?

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

相关说明: .Add()的行为将在EF7 - beta 8中改变(参见PR#2979)。当你为父项调用. add时,更改跟踪器现在将包括所有的"子"实体。

相关内容

最新更新