【问题标题】:How to write Data Transfer Object?如何编写数据传输对象?
【发布时间】:2012-06-12 09:01:36
【问题描述】:

在我的 N 层架构中,我有 DTO (AddressResponseDTO),其中有大约 20 个属性。当表示层向我的业务层请求(AddressRequestContext)特定搜索操作的响应时,我会将此 DTO(AddressResponseDTO)发送给 PL。

但情况并非总是如此。地址搜索请求将被更改有时我只需要发送它的 3 个属性(比如说城市、邮编和地址计数),有时它可能是 5 个。所以我仍然可以拥有具有 20 个属性的相同 DTO 来重用所有类型的搜索请求。

【问题讨论】:

  • 当你说 n 层和 DTO 时——你能说清楚:这些是逻辑边界吗?装配边界?还是进程间/机器间边界?条款被严重超载,所以明确说明是值得的

标签: c# .net n-tier-architecture


【解决方案1】:

由于 OP 声明有时只使用其中的 3 个属性,因此可以有几种解决方案:

  • 创建一个包含所有属性的 DTO,并指定特殊值以显示未指定的属性(即使用可空值或特殊值)。这需要对代码进行大量检查。

  • 创建具有 3 个属性的 DTO。从此继承第二个 DTO 并添加所有剩余的属性。您的方法可以接收基类作为参数并检查是否接收到基类或派生类。像if (myDto is DtoBase) ... 这样的简单检查将快速显示哪些属性已随 DTO 一起发送。 (这仅适用于继承 DTO 层次结构中越来越多的属性)

  • 如果感兴趣的属性有多个可能的分组,您可以为每个组使用一个 DTO 类,并且:

    • 创建一个将此 DTO 作为成员的类。如果您不需要它们,请将它们留空。这样您就可以使用简单的if (containerDto.Dto1 != null) 检查每个组
    • 为每种情况定义尽可能多的 DTO 参数。

我不喜欢“特殊值”方式,因为它需要更多代码并且更容易出错。此外,它使您在许多情况下(反)序列化更多信息。

【讨论】:

    【解决方案2】:

    编写具有 20 个属性的 DTO 并没有什么坏处。

    但是,如果属性可以组合在一起,最好将相关属性组合成一个实体,就像你可以将 City、Zip 组合成一个地址。

    【讨论】:

      【解决方案3】:

      是的,如果在这些情况下空属性或默认属性不会打扰您,您可以。从理论上讲,没有什么可以阻止您在所有情况下都使用一个类。

      或者您可以针对不同的用例创建多个 DTO 类定义。在这种情况下,我建议在这些类之间使用一些类层次结构。

      我认为这取决于您以及您喜欢使用哪种方式的用例的复杂性。

      【讨论】:

        猜你喜欢
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多