Ste*_*Kok 5 c# domain-driven-design dto value-objects
在我的域中,每个域实体可能有许多值对象。我创建了价值对象来表示金钱、重量、数量、长度、体积、百分比等。
这些值对象中的每一个都包含一个数值和一个度量单位。例如 money 包含货币价值和货币 ($, euro,...) , weight 包含数值和重量单位(kilo, pound, ...)
在用户界面中,这些也并排显示:字段名称、其值后跟其随附单元,通常在属性面板中。域实体具有向 UI 公开的等效 DTO。
我一直在寻找将 DTO 内的值对象传输到 UI 的最佳方法。
我已经进行了深入搜索,但似乎没有其他问题可以完全解决这个问题。非常感谢任何建议!
编辑:在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要从客户端发回这些数据,则无法轻松地在 DTO 对象中直接重复使用它们,除非您拥有的任何 DTO 映射系统(自定义 WebAPI 模型绑定器、Automapper 等)可以轻松地将 DTO 绑定到使用构造函数的值对象...这对您来说可能是也可能不是问题,它可能会变得混乱:)
对于这样的事情,我倾向于远离“通用”DTO 对象,但请记住,在 UI 上,您仍然希望客户端代码能够使用一些“域”的外观(无论它是否是 Javascript)在网页上或在表单/控制台上的 C# 上,或者其他)。另外,找到一个具有以下特征的特殊值对象往往只是时间问题Name/Value/Unit/Plus One Weird Property specific to that Value concept
处理此问题的唯一“万无一失”***方法是每个值对象一个 DTO;虽然这是额外的工作,但你不会真的出错 - 如果你有很多很多这些值对象,你总是可以编写一个简单的 DTO 生成工具或使用 T4 模板来为你生成它们,基于公共属性你的值对象。
***不保证
| 归档时间: |
|
| 查看次数: |
2946 次 |
| 最近记录: |