【发布时间】:2015-04-23 13:07:48
【问题描述】:
在我的域中,每个域实体可能有许多值对象。我创建了值对象来表示金钱、重量、计数、长度、体积、百分比等。
每个值对象都包含一个数值和一个度量单位。例如。 money 包含货币价值和货币 ($, euro,...) , weight 包含数值和重量单位 (kilo, pound, ...)
在用户界面中,这些也并排显示:字段名称、其值及其伴随的单位,通常在属性面板中。域实体具有向 UI 公开的等效 DTO。
我一直在寻找将 DTO 中的值对象传输到 UI 的最佳方式。
- 我是否只是将特定值对象公开为 DTO 的一部分?
- 我是否公开了在 DTO 中提供名称/值/单元的通用“值对象”等效项?
- 我是否在 DTO 中将其拆分为单独的名称/值/单元成员,只是为了在 UI 中重新组合它们?
- 我是在 DTO 中将它们作为 KeyValuePair 还是 Tuple 传输?
- 还有别的吗?
我进行了深入搜索,但似乎没有其他问题可以完全解决这个问题。非常感谢任何建议!
编辑: 在 UI 中,值和单位都可以更改并发送回域进行更新。
【问题讨论】:
-
1) 似乎是最简单的方法,为什么要让它变得更复杂?
-
@dbugger,很多关于值对象的讨论。大多数似乎表明不将域对象公开为反模式。我愿意公开它们,但想了解利弊。
-
是的,在核心域实体的情况下可能存在耦合问题。然而,在这种情况下,添加一组重复对象和额外的转换代码似乎增加了撤消的复杂性。
-
当用户编辑“货币”时,“MoneyDTO”的金额字段会发生什么变化?这是否会对“订单”中的其他字段产生连锁反应(例如总计、增值税等)。现在需要更改吗?是这样吗:(1)谁负责保持这些一致,(2)您是否将这个修改后的 MoneyDTO 实例封送回不正确的状态(更改货币,未更改金额)?
-
@Alex,这个域不关心增值税等。这可以被认为是主数据。例如(一个简单的例子)供应商以美元报价他们的购买价格,即使他们可能位于加拿大。出于某种原因,未来的新价格以加元报价。该域已经具有随时间变化的汇率,如果需要,只需将所有货币价值转换为基础货币(可能是美元),然后再以单一货币计算整体最优计划。自然,货币的变化不会经常发生,但价值会发生。
标签: c# domain-driven-design dto value-objects