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

时间:2018-05-08 14:27:05

标签: oop domain-driven-design value-objects

遵循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");
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

对我来说,Value Object与其他类型的对象在考虑密封时几乎没有什么区别。多年来,无论是赞成还是反对,都有无数的争论,因为你不想在方程式中添加另一个变量。

我几乎看不到域模型中的所有VO都被密封,但所有其他类都未密封。如果你打算封印,它主要是出于一系列不同的原因(组织,性能)与DDD命名法中的对象类型没有多大关系。