ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 在DDD中如何通过DTO传递Value Objects?

2019-06-09 16:55:17  阅读:195  来源: 互联网

标签:c dto domain-driven-design value-objects


在我的域中,每个域实体可能有许多值对象.我创建了价值对象来代表金钱,重量,数量,长度,数量,百分比等.

这些值对象中的每一个都包含数值和度量单位.例如. 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模板为你生成它们,基于公共属性你的价值对象.

***不是保证

标签:c,dto,domain-driven-design,value-objects
来源: https://codeday.me/bug/20190609/1205798.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有