gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:03:28 27 4
gpt4 key购买 nike

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

这些值对象中的每一个都包含一个数值和一个度量单位。例如。 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com