值对象的实现是否应该被密封?
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 命名法中的对象类型没有太大关系。
按照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 命名法中的对象类型没有太大关系。