在我的域中,每个域实体可能有许多值对象.我创建了价值对象来代表金钱,重量,数量,长度,数量,百分比等.
这些值对象中的每一个都包含数值和度量单位.例如. money包含货币值和货币($,euro,…),weight包含数值和重量单位(kilo,pound,…)
在用户界面中,这些也是并排显示的:字段名称,其值后跟其附带的单位,通常在属性面板中.域实体具有暴露给UI的等效DTO.
我一直在寻找将DTO中的值对象传递到UI的最佳方法.
>我是否只是将特定值对象公开为DTO的一部分?
>我是否公开了一个通用的“价值对象” – 在DTO中提供名称/价值/单位的等价物?
>我是否将其拆分为DTO内的单独名称/值/单位成员,只是为了在UI中重新组合它们?
>我是否将它们作为KeyValuePair或TPC转移到DTO中?
>还有别的吗?
我已经密集搜索,但似乎没有其他问题可以解决这个问题.非常感谢任何建议!
编辑:
在UI中,值和单位都可以更改并发送回域进行更新.
解决方法:
如果这些是单向转移,我倾向于同意上面的debuggr的评论;值对象实际上不是域对象 – 它们没有可以改变其状态的行为,因此在很多方面它们只是专门的“位桶”,因为你可以在不丢失上下文的情况下对它们进行序列化.
然而;如果您遵循DDD实践(或者如果您的后端使用多线程等),那么您的值对象是不可变的,即它们可能看起来像这样:
public class Money
{
readonly decimal _amount;
readonly string _currency;
public decimal Amount {get{return _amount;}}
public decimal Currency {get{return _currency;}}
public Money(decimal amount, string currency)
{
//validity checks here and then
_amount=amount;
_currency=currency;
}
}
现在,如果您需要从客户端发回这些内容,则无法直接在DTO对象中重复使用它们,除非您拥有的任何DTO映射系统(自定义WebAPI模型绑定器,自动映像等)可以轻松地将DTO绑定到使用构造函数的值对象…对你来说可能是也可能不是问题,它可能会变得凌乱:)
>我倾向于远离“通用”DTO对象,但是请记住,在UI上你仍然需要一些相似的“域”,以便客户端代码可以使用(无论是否是这样)网页上的Javascript或表单/控制台上的C#等等.此外,在您找到具有特定于该Value概念的Name / Value / Unit / Plus一个奇怪属性的特殊值对象之前,往往只是时间问题.
>处理这个问题的唯一“傻瓜式”***方法是每个价值对象一个DTO;虽然这是额外的工作你不会真的出错 – 如果你有很多很多这些价值对象,你总是可以编写一个简单的DTO生成工具或使用T4模板为你生成它们,基于公共属性你的价值对象.
***不是保证