Java 如何建模和处理演示文稿DTO';如何从复杂的领域模型中抽象?

Java 如何建模和处理演示文稿DTO';如何从复杂的领域模型中抽象?,java,architecture,spring-mvc,n-tier-architecture,Java,Architecture,Spring Mvc,N Tier Architecture,您好,我正在开发一个需要使用Hibernate处理复杂域模型的应用程序。该应用程序使用SpringMVC,在表示层中使用域对象非常混乱,因此我认为应该使用往返于服务层的DTO,以便这些DTO与我在视图中需要的匹配。现在让我们假设我有一个carlese实体,它的属性不是简单的java原语,而是由Make、Model等其他实体组成的 public class CarLease { private Make make; Private Model model;

您好,我正在开发一个需要使用Hibernate处理复杂域模型的应用程序。该应用程序使用SpringMVC,在表示层中使用域对象非常混乱,因此我认为应该使用往返于服务层的DTO,以便这些DTO与我在视图中需要的匹配。现在让我们假设我有一个carlese实体,它的属性不是简单的java原语,而是由Make、Model等其他实体组成的

    public class CarLease {
        private Make make;
        Private Model model;
        .
        .
        .
    }
大多数属性都是这样的,它们可以使用jsp视图上的下拉选择进行选择,每个属性都会向控制器发回一个ID

现在考虑一些标准用例:创建、编辑、显示

您将如何对要用作表单支持对象以及表示层和服务层之间的通信的表示DTO进行建模

您会为每个案例(创建、编辑、显示)创建不同的DTO吗?您会为复杂属性创建DTO吗?如果是,您将在哪里将ID转换为实体

您将如何处理验证、DTO/域组装以及从服务层方法返回什么?(创建、编辑、获取)

如你所见,我现在将受益于将我的视图与域对象分离(非常复杂,有很多我不需要的东西)。但是我很难找到任何现实世界中的例子和最佳实践。我需要一些自上而下的架构指导,请记住我将使用SpringMVC,以防可能会利用您的anwser

提前感谢。

我已经定义了一系列类型(DTO),用于在业务层和数据层之间交换数据;每个域对象/实体有不止一种类型。这些被定义为简单类

其中每一项都是根据特定的任务构建的,例如:

  • 我有一个轻量级的类型,用于填充列表视图(有很多“行”,但没有很多“列”)。我还有一个对应的集合类型,它可以容纳任意数量的这些集合
  • 我有一个“大”get副本,它通常具有所讨论的实体的所有属性——但只有一个实例。根据实体的大小和复杂程度以及使用情况,我可能会有不止一个;并且还取决于您是希望立即返回与实体实例关联的所有数据,还是在以后的请求中延迟加载一些数据
  • 我通常对实体有单独的“保存”(new)和“更新”类型
每种类型都设计为只保存与给定任务相关的信息。 例如,“big”将返回上次修改的日期,但我不希望在我的save和update类型中返回,因为我在数据访问层中填充了这些类型

此外,对于我的应用程序,这些类型存在于一个公共程序集中,因此它们可以在任何层之间重复使用,而不仅仅是在业务层和数据层之间

建筑合身性

这种方法没有什么特别之处,它有自己的优点和缺点;确切地说,这些是什么以及它们对你的影响将取决于很多事情——我想你的里程数会有所不同——但多年来,这确实让我受益匪浅

人们经常对“关注点分离”大惊小怪——这是一个非常明智的举动;这与DTO有关,因为DTO在层(以及服务、组件等)之间进行交换,因此始终存在一些不明确的界限

我采取的方法是,如果一点信息适合在多个层之间交换,那么它可能适合在任意数量的层之间交换——那么为什么不让所有人都可以访问它呢?如果你只是在传递信息,它还可以节省你重新播放信息的时间

就复杂性而言,有两种处理方法:

  • 对所有人使用详细/人类可读的命名约定;类型,让你知道什么是事物;不管有多少,这就是intelli sense(&docs)的用途。越直观越好
  • 接吻——尽可能地让事情简单;您必须平衡合理的重用和单一责任原则(SRP)
  • 您会为主实体的复杂属性创建DTO吗?

    我发现自己制作DTO的原因有两个:

  • 我知道我需要公开(推送)一些数据,DTO的设计也很简单:它是由我想要公开的数据驱动的
  • 拉动:消费者知道自己想要什么,DTO的设计就是为了满足这些需求
  • 因为它们都是在一个公共程序集中定义的,没有一个组件“拥有”它,这有助于迫使您从“域”的角度而不是以组件为中心的角度进行思考;在某种程度上,这将影响DTO的设计(平衡重用与SRP)

    在这两种情况下,DTO可以是特定于特定需求的,也可以是通用的;e、 g,只有int和字符串的DTO并不少见,这是一种用于发送到dropdownlists的东西


    我发回的大多数DTO集合(从DAL到BL)都是特定于一个概念的,而不是通用的。我通过我提供的构造函数来执行这些非常基本的规则:每个arg都是必需的。我不确定这是否回答了您的问题“如何管理组装和验证”。

    服务层应该返回DTO而不是EJB对象的想法主要是EJB3/JPA时代之前的想法。在CRUD期间,直接使用模型对象(又称实体)确实可以获得很多好处

    但是,当用于性能优化时,您可以从使用DTO中获益,例如,当模型对象太大时,或者当您使用一些智能连接来聚合模型数据时

    所以,除非你是美国工程师