c# - 在 DDD 中如何通过 DTO 传递值对象?

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

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

这些值对象中的每一个都包含一个数值和一个度量单位。例如。 money 包含货币值(value)和货币 ($, euro, ...) , weight 包含数值和重量单位 (kilo, pound, ...)

在用户界面中,这些也并排显示:字段名称、其值后跟其伴随的单位,通常在属性面板中。域实体具有向 UI 公开的等效 DTO。

我一直在寻找将 DTO 中的值对象传输到 UI 的最佳方法。

  1. 我是否只是将特定值对象公开为 DTO 的一部分?
  2. 我是否公开了一个通用的“值对象”——在 DTO 中提供名称/值/单位的等价物?
  3. 我是否将其拆分为 DTO 中单独的名称/值/单位成员,只是为了在 UI 中重新组合它们?
  4. 我是否将它们作为 KeyValuePair 或 Tuple 传输到 DTO 中?
  5. 还有别的吗?

我进行了深入搜索,但似乎没有其他问题可以完全解决这个问题。非常感谢任何建议!

编辑: 在 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 模型绑定(bind)器、Automapper 等)可以轻松地让你绑定(bind)使用构造函数将 DTO 转换为值对象...这对您来说可能是问题,也可能不是问题,它可能会变得困惑 :)

  • 尽管如此,我倾向于远离“通用”DTO 对象,但请记住,在 UI 上,您仍然希望客户端代码使用一些类似的“域” (无论是网页上的 Javascript 还是表单/控制台上的 C#,还是其他)。此外,您迟早会发现具有 Name/Value/Unit/Plus One Weird Property specific to that Value concept

  • 的特殊值对象
  • 处理此问题的唯一“万无一失”*** 方法是每个值对象一个 DTO;虽然这是额外的工作,但你不会真的出错——如果你有很多很多这样的值对象,你总是可以编写一个简单的 DTO 生成工具或使用 T4 模板为你生成它们,基于的公共(public)属性你的值(value)对象。

***不是保证

关于c# - 在 DDD 中如何通过 DTO 传递值对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652953/

相关文章:

javascript - 使用 "dotnet new react -o my-app"中的默认代码时,为什么会出现 JSON.parse 错误?

c# - Mef 导入实现在运行时指定的接口(interface)的所有类型

domain-driven-design - DDD - 如何在应用层重用代码?

asp.net-mvc - 是否应该始终在模型级别强制执行验证规则?

c# - 在调试中关闭 WCF 应用程序启动

c# - 在 C# 中使用流读取大文本文件

c# - 实现业务规则的规范模式

java - 如何使用 Spring 数据 REST 公开自定义 DTO crud 存储库?

java - 何时在 Angular + Java 项目中使用 DTO 和 Matpstruct

c# - 在 C# 中克隆 DTO