值对象的实现是否应该密封?



按照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");
}

通常,最佳做法是避免由于组合而不是继承建议而导致的多态性。在 DDD 上下文中,在某些情况下,允许将来的多态性很有用,但这通常包括实体。

每个定义的值对象应该是不可变的,为了避免进一步的滥用,请密封它。

有用的链接: http://thepaulrayner.com/value-objects-and-immutability/

对我来说,在考虑密封时,价值对象与其他类型的对象几乎没有区别。多年来,无数支持和反对它的论点都足够复杂,以至于您不想在等式中添加另一个变量。

我几乎看不到域模型中的所有 VO 都被密封,但所有其他类都没有密封。如果要密封,主要是出于完全不同的原因(组织、性能(,这些原因与 DDD 命名法中的对象类型没有太大关系。

相关内容

  • 没有找到相关文章

最新更新