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

Should the implementation of value object be sealed?

按照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 上下文中,在某些情况下允许未来的多态性很有用,但这通常包括实体。

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

有用link:http://thepaulrayner.com/value-objects-and-immutability/

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

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