Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model 视图层中的DTO或域模型对象?_Model_Dto_Data Transfer Objects - Fatal编程技术网

Model 视图层中的DTO或域模型对象?

Model 视图层中的DTO或域模型对象?,model,dto,data-transfer-objects,Model,Dto,Data Transfer Objects,我知道这可能是一个由来已久的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上将值直接绑定到它们(我使用的是JSF)。或者将域模型对象转换为DAO或服务层中的DTO,并向表示层发送轻量级DTO 我被告知使用DTO没有任何意义,因为对数据库的更改将导致对所有DTO的更改,而在任何地方使用模型对象只需要对受影响的模型对象进行更改。然而,DTO的易用性和轻量级似乎超过了这一点 我应该注意到,我的应用程序使用Hibernate模型对象,并使用它自己定制的模型对象(这意味着不绑定

我知道这可能是一个由来已久的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上将值直接绑定到它们(我使用的是JSF)。或者将域模型对象转换为DAO或服务层中的DTO,并向表示层发送轻量级DTO

我被告知使用DTO没有任何意义,因为对数据库的更改将导致对所有DTO的更改,而在任何地方使用模型对象只需要对受影响的模型对象进行更改。然而,DTO的易用性和轻量级似乎超过了这一点

我应该注意到,我的应用程序使用Hibernate模型对象,并使用它自己定制的模型对象(这意味着不绑定到任何DB会话,总是分离的)。上述场景中的任何一种对严格的模型对象模式更有利吗?使用Hibernate对于惰性初始化异常等问题来说是一个巨大的缺陷

我正在编辑此问题,希望进一步讨论(不确定我是否正确):

我对模型对象的问题是它们根本不灵活。下面的一条评论说,应用程序的设计应该使模型对象可以在所有层中使用。为什么?如果一个用户想要一个荒谬的功能,我是否应该告诉他们,‘这对模型对象不起作用’

简单明了,模型对象有时无法工作。你可能有:

public class Teacher {
    List<Student> students;
    [tons of other Teacher-related fields]
}
public class Student {
    double gpa;
   [tons of other Student-related fields]
}
公共课堂教师{
列出学生名单;
[大量其他与教师相关的领域]
}
公立班学生{
双gpa;
[其他与学生相关的领域]
}
但也许你不需要这些信息。你只需要老师的姓氏,他们今年教的学生人数,以及所有学生的平均绩点加起来。在那种情况下你会怎么做?检索完整的教师信息和学生关系,然后您的代码获得学生列表上的计数,然后计算内部所有GPA的总平均值?这似乎比简单地创建一个带有“String lastName”、“int numStudents”和“double combinedpa”的DTO要费劲得多


听起来我已经下定了决心,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全干净地使用。普通的现实世界中的应用程序有着不同寻常的用户需求,但却不能以这种方式工作。

DTO如今被广泛认为是一种反模式,建议通常是“不惜一切代价避免它们”


像Hibernate这样的ORM框架的一个主要优点是,您可以在所有级别使用域对象,而不需要DTO。当然,需要注意的是,您必须花一些时间来考虑这些关系:何时使用延迟抓取,何时使用渴望,等等。

域对象的另一次投票。就领域驱动设计而言,领域模型是王者,应该尽可能使用。应用程序的设计应该使大多数层(bar基础设施层)都可以使用域对象


我认为DTO只有在对象需要序列化的情况下才有用。如果没有通过线路或不兼容的体系结构进行传输,我就不会使用它们。DTO模式有助于将序列化排除在域对象之外。考虑到UI/域交互不需要序列化,请保持简单并使用实际对象。

当域对象发送有问题时的场景:

  • 您可能需要将聚合信息或其他类型的“计算字段”发送到UI层(在示例Flex/GWT中),并且不希望弄乱域对象
  • 您可能会遇到序列化循环对象图的需要(在您的示例中,如果Student具有列表关系),一些协议在这方面存在问题
  • 处理框架序列化程序时Hibernate LazyInitializationException(blazeDS for flex/GWT序列化程序)

  • 我不确定这在这些情况下是否是一个明确的答案,这实际上取决于应用程序的复杂性。将域对象混合到视图层有两种可能的含义:

  • 您可能会试图修改域对象以适应视图层中需要的内容
  • 由于域对象提供的内容与视图真正需要的内容不匹配,视图层将包含额外的复杂性。您可能无法避开这种复杂性,但它可能不属于视图层
  • 如果域对象很简单,视图很少,那么跳过DTO可能是最简单的事情


    另一方面,如果您的域模型可能会发展并变得复杂,并且您的视图可能会大量且多样,那么拥有视图特定的对象可能是一个好主意。在MVC世界中,使用ViewModels是很常见的,对我来说很有意义。

    我认为使用DTO通常不是一种反模式。有很多人和系统在使用它们,您得到的好处是解耦的视图层,它可以独立于域模型进行设计和模块化。虽然我同意您应该尽可能使用域对象,但在某些情况下,将视图层直接绑定到域模型时可能会遇到问题


    我在视图模型方面有很好的经验,它只围绕域对象,并将大部分操作委托给它们。这将使视图和域层解耦,允许灵活地组合域对象,而且由于IDE支持委托模式,所以仍然没有太多的工作要实现。

    在我看来,在每个层中使用域模型对象完全没有问题。你说你不需要所有的信息。在JSP中,只使用所需的数据。没有人强迫