遵循DDD实践,是否应该密封价值对象的实施?
想象一下,有一些抽象的ValueObject<T>
和具体的实现给出Money : ValueObject<Money>
。我应该封Money
吗?
public class Money : ValueObject<Money>
{
private Money()
{
}
private Money(decimal value, string currency)
{
Requires.NotEmpty(currency, nameof(currency));
Requires.That(value >= 0, $"{nameof(value)} must be greater or equals to 0.");
Value = value;
Currency = currency.ToUpper();
}
public decimal Value { get; private set; }
/// <summary>
/// <a href="http://currencysystem.com/codes/">ISO 4217</a> currency code
/// </summary>
public string Currency { get; private set; }
public static Money Dkk(decimal value) => new Money(value, "DKK");
public static Money Usd(decimal value) => new Money(value, "USD");
}
答案 0 :(得分:1)
通常,它是避免由于继承建议的组合而导致的多态性的最佳实践。在DDD上下文中,在某些情况下允许将来的多态性很有用,但这通常包括实体。
每个定义的值对象应该是不可变的,为了避免进一步滥用,请将其封存。
有用的链接:http://thepaulrayner.com/value-objects-and-immutability/
答案 1 :(得分:0)
对我来说,Value Object与其他类型的对象在考虑密封时几乎没有什么区别。多年来,无论是赞成还是反对,都有无数的争论,因为你不想在方程式中添加另一个变量。
我几乎看不到域模型中的所有VO都被密封,但所有其他类都未密封。如果你打算封印,它主要是出于一系列不同的原因(组织,性能)与DDD命名法中的对象类型没有多大关系。