DDD值对象相等,== vs .Equals()

时间:2013-01-24 17:12:20

标签: c# nhibernate domain-driven-design equality value-objects

所以我有一个值object,(任意说钱),我想为它实现相等。我知道==.Equals()的目标/默认行为(参考和数据相等)。

在这种情况下,我希望能够比较两个对象,并说它们相当于计算(例如1m和3ft相当) 但是对于持久性(使用NHibernateisDirty我认为取决于平等),用户显示和选择货币,我希望它们被认为是不同的。

在这种情况下,我应该

  1. ==.Equals()有不同的行为(哪些应该做什么),
  2. 无论我想检查等效性,只需检查每个属性(意味着额外的代码)
  3. 实施像.IsEquivalent()这样的方法(我不想做后者)
  4. 我缺少的其他东西
  5. 我应该遵循最佳做法/模式吗? 感谢

    编辑: 我得到了一些关于改变汇率的回应。所以要更新清晰度。让我们说高度,而不是货币

    • 我想澄清一些假设:
    • // ignore:值对象包含小数,字符串/类货币
    • // ignore:汇率不会改变。
    • // ignore:类货币知道其与其他货币的汇率。
    • value对象包含decimal qty,string / class unit
    • 班级单位知道其与其他人的转换
    • 我不打算扩大费率/转换率

    我更关注实践和模式,而不是实施货币。 基本上,相同的方法是一个人的身高,其中身高是一个价值对象,({1,m}到{3,ft},其中1m总是“等于”/“相当于”3英尺)

3 个答案:

答案 0 :(得分:5)

我不会将1.0美元视为等于至0.63英镑。为了检查monitary值的相等性,你需要的信息不仅仅是两个值 - 你还需要当前的汇率等。尤其如此,因为相同的两个值不会一致的,如果两个值相等,则等式应该始终为真。

因此,一种方法,例如AreEquivalentMonitaryValues()似乎是合适的 - 特别是考虑到需要额外的信息。

答案 1 :(得分:2)

由于您需要不同的相等定义,具体取决于您要使用IEqualityComparer的上下文。

作为类型本身的Reed suggests等式应该真正意味着“永远和永远是平等的”而不是等于当前的汇率,但是拥有IEqualityComparer只意味着“从这个角度来看”比较,他们是平等的“。从那里你可以拥有ExchangeRate类型,或者给定汇率的东西,能够创建一个IEqualityComparer<Money>对象,代表给定汇率的等式 。然后可以使用该等式比较来比较各种类型的货币是否相等。

另一种方法完全是创建“不变货币”,并提供您的类ToInvariantFromInvariant方法,以便非不变货币不等于(永远)和不变货币可以相等尽管货币产生了不变的价值。

答案 2 :(得分:0)

创建一个类MoneyExchangeRates,其方法为IsWorthApproximatelyTheSame(Money m1, Money m2)

汇率随时间变化,不会使它们成为全球可变状态。