首页 > 解决方案 > 值对象的实现是否应该被密封?

问题描述

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

标签: oopdomain-driven-designvalue-objects

解决方案


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

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

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


推荐阅读