如何编写数据传输对象?

时间:2012-06-08 09:46:13

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

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

但事实并非如此。地址搜索请求将被更改有时我只需要发送它的3个属性(比如City,Zip和地址Count),有时候它可能是5.所以我仍然可以使用20个proerties的相同DTO来重用所有类型的搜索请求。

3 个答案:

答案 0 :(得分:2)

编写具有20个属性的DTO没有任何害处。

但是,如果可以将属性组合在一起,最好将相关属性分组到实体中,就像您可以将City,Zip分组到一个地址一样。

答案 1 :(得分:2)

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

  • 创建具有所有属性的DTO,并指定特殊值以显示未指定哪些属性(即使用nullables或特殊值)。这需要在代码中进行大量检查。

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

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

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

我不喜欢“特殊价值”的方式,因为它需要更多代码,而且更容易出错。此外,它使你(多)在很多场合序列化更多信息。

答案 2 :(得分:1)

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

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

我认为这取决于您和用户喜欢使用的复杂程度。