在域模型的DDD设置程序中,代码气味。
应避免使用它们,原因很简单,因为它们实际上不是域的一部分。领域专家不会理解其中的任何名词,而是应通过特定方法来更改数据。
例:
customer.StreetName = ...
customer.City = ...
尽管正确的方法是使用
customer.ChangeAddress
方法,然后可以发布事件等。至少从我的理解来看,这全是合理的理论,我可以完全理解为什么域模型中的设置方法不是真正的理想的。但:
如果您的域模型没有设置器,那么这些方法将很难测试。
如果我不能没有一个接受所有参数的大型构造函数或做一些反射魔术,就不能构造一个Customer实例来对它进行测试?我在后端使用NHibernate,因此NHibernate首先已经做了一些反射魔术来填充这些字段。
但是拥有一个带有10个参数的ctor真的很糟糕。(而且工厂方法也是如此)。
有什么建议吗?
丹尼尔的问候
最佳答案
在经典(非CQRS)DDD中,将所有数据分解为值对象是一种好习惯,这样您的实体就可以简化为它们的主要功能:维护身份。
在您的示例中,客户应该引用一个Address ValueObject并具有一个ChengeAddress方法,该方法应该很简单:
public void ChangeAddress(Address address)
{
//Consistency rules are here
_address = address;
}
尝试将尽可能多的逻辑从实体转移到价值对象。由于高价值对象很小且不可变,因此它们本质上更易于测试。您可以使用构造函数在给定状态下实例化VO并执行它(通常是通过调用返回另一个转换后的VO实例的方法)。
最后但并非最不重要的一点是,根据我的经验,我可以说,如果测试域模型需要其他基础结构(例如反射或任何其他工具),那么您做错了(通过引入不必要的耦合)。
关于c# - 域模型中的二传手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3716770/