我正在查看Sharp Architecture的代码。到目前为止,这很酷,但我在理解如何在框架中实现DDD值对象方面遇到了问题(代码中似乎没有提到这一点)。我假设基础Entity类和Repository基础仅用于实体。关于如何在框架中实现价值对象,有什么想法吗?
在Sharp Arch中,命名空间SharpArch.Domain.DomainModel中有一个类ValueObject。该对象继承自BaseObject并重写==和!=运算符以及Equals()和GetHashCode()方法。该方法重写只调用这两个方法的BaseObject版本,这两个版本又使用GetTypeSpecificSignatureProperties()方法来获取要在相等性比较中使用的属性。
底线是,实体的平等性由决定
- 引用相等
- 相同类型
- 身份证是一样的
- 使用[DomainSignature]属性装饰的所有属性的比较
对于ValueObject,使用BaseObject的Equals方法
- 引用相等
- 相同类型
- 比较所有公共属性
这有点简化,我建议您从github获得最新的代码,并亲自阅读上述3个类中的代码。
编辑:关于持久性,这个SO问题可能会有所帮助。除此之外,请参阅NH和Fluent NH的官方文档
Value对象是不需要基类的简单对象。(实体具有基类的唯一原因是基于标识提供相等性)。实现一个值对象只意味着创建一个类来表示域中的值。很多时候,值对象应该是不可变的,并提供相等性比较方法来确定与相同类型的其他值对象的相等性。看看这里。