代码之家  ›  专栏  ›  技术社区  ›  Tomas Vana

如何处理和组织不同上下文的DTO?

  •  4
  • Tomas Vana  · 技术社区  · 16 年前

    在各种情况下使用简单的DTO时,我经常遇到同样的问题,我总是想知道是否有更好的方法来处理它。

    问题是,我有一个业务对象,例如 Asset 它有许多属性、子对象和计算字段,其中一些在时间意义上计算起来很昂贵,其中一些在数据意义上非常庞大。我需要在用户界面的不同屏幕中使用不同风格的这个对象,例如

    • 在显示层次结构的树中,我只需要显示名称
    • 在网格中,我只显示几个属性
    • 在详细信息窗格中,有大量可用信息,但仍有一些信息(如映射对象)是按需显示的。

    为了能够在这种情况下获得最佳性能,我总是为每个上下文创建不同的DTO,只包含在该上下文中实际使用的信息子集。作为一个资源优化解决方案,这会导致以下几个问题:

    • 我有大量DTO类的类爆炸
    • 我很难为同一件事想出不同的名字,比如 AssetDtoForGridInTheOverviewScreenInTheUpperPaneAboveTheSplitter 更不用说以后还要维护它们了
    • 我经常在转换方法中重复自己,因为有一些属性被 但不是由 全部的 其中(因此,我不能将它们放入任何超类中并重用转换逻辑)

    我使用的技术是ASP.NET SOAP Web服务和C 3.5,但我认为这可能是一个语言不可知的问题。欢迎有任何想法。

    2 回复  |  直到 8 年前
        1
  •  3
  •   jtate    8 年前

    这是DTO的已知问题。在这本书中描述的,否则是平庸的。 articule on MSDN . 换言之:DTO是最通用的N层数据访问模式,但它也需要大部分的工作。

    您可以使用基于约定的映射来解决映射中的一些问题,例如 AutoMapper .

    当涉及到类爆炸时,是否您使用的是过于扁平的数据结构?

    这很难说清楚,因为DTO自然包含大量语义重复,结果证明它们根本不是逻辑重复。例如,即使您有语义相似的类型,如果其中一个是ViewModel,另一个是域对象,那么它们可能共享语义结构,但它们的职责却大不相同。

    另一方面,如果你有很多重复 在同一应用层中 (例如ui),您可能违反了dry原则。在这种情况下,将相关数据封装到一个单独的类中通常会有所帮助。在我所了解的大多数UI框架中,您仍然可以将平面显示数据绑定到层次结构类。

        2
  •  1
  •   Johannes Rudolph    16 年前

    类爆炸的问题是DTO方法固有的问题,对此您可能做不了多少。注意不要将视图模型与DTO模型混合在一起。DTO应该只用于从数据层获取数据到前端,而不用于表示。

    随着.NET 3.5的出现,您可以选择实现一些基本的、更粗粒度的DTO,并用一个匿名类型替换您的ViewModel,您可以在DTO的基础上动态创建它。我发现这是一个非常灵活的解决方案。

    关于命名约定,将DTO分组到场景中并将它们放入相应的名称空间可能很有用。例如 Solution.AssetManagement.Asset Solution.AssetReporting.Asset