【发布时间】:2013-01-24 17:12:19
【问题描述】:
所以我有一个值object,(随意说钱),我想为它实现平等。我知道 == 和 .Equals() 的预期/默认行为(引用和数据相等)。
不过,在这种情况下,我希望能够比较两个对象,并说它们在计算上是等价的(例如 1m 和 3 ft 是等价的)
但是对于持久性(使用NHibernate,我认为isDirty 取决于平等)、用户显示和货币选择,我希望它们被认为是不同的。
我应该,在这种情况下,
-
==和.Equals()有不同的行为(应该做什么), - 无论我想在哪里检查等效性,只需检查每个属性(意味着额外的代码)
- 实现类似
.IsEquivalent()的方法(我不喜欢后者) - 我缺少的其他东西
是否有我应该遵循的最佳实践/模式? 谢谢
编辑: 我收到了一些关于汇率变化的回复。为了清楚起见,所以更新。让我们说高度,而不是货币
- 我想澄清一些假设:
- //忽略:值对象包含十进制金额,字符串/类货币
- //忽略:汇率不变。
- // 忽略:类货币知道其与其他货币的汇率
- 值对象包含十进制数量,字符串/类单位
- 类单元知道它与另一个单元之间的转换
- 我不打算扩大费率/转化率等
我更关心实践和模式,而不是实施货币。 基本上,同样的方法来处理一个人的身高,其中身高是一个值对象,({1,m} 到 {3,ft},其中 1m 始终“等于”/“等于”到 3ft)
【问题讨论】:
-
使用 3) 它比 1) 干净得多。您还需要传入一个表示不同货币兑换价格的对象,因此这甚至不适合
==或Equals的方法签名。
标签: c# nhibernate domain-driven-design equality value-objects