虽然我不能说团队为什么做出这个决定,但我绝对同意DTO/VM概念不是很清楚。
我认为,其基本思想类似于MVP/MVC模式,其中通常引入一个新的视图模型来获得MVVM模式。因此,不影响任何视图的DTO被“推入”实际的模型/控制器层。没关系,如果你说DTO是服务之间的传输对象。
但是,我们在老jijers-app中也遇到了麻烦,并且与层和DTO,VM等进行了很多讨论。我们在jhipster推出DTOs和Mapstruct的同时开始了这个工作。在我们使用Jhipster的新项目中,我们总是删除所有DTO和VM。首先:(托管)UserVM/DTO的东西,这是非常混乱。这有几个原因:
我们的应用程序的服务器端从来没有虚拟机。在一个jijster应用程序中,视图完全基于javascript/angular,视图模型必须在那里。我们经常有其他使用REST-API的应用程序,这些应用程序不是视图。因此,特别是在微服务架构中,我从来不会在REST-API“视图”甚至“视图模型”中调用某些东西。 因此,在没有用Java编写视图的应用程序中(使用JSP等),在我们的Java代码中永远不会找到术语“VM”。此外,可能存在不同类型的视图(例如,角度web应用,iOS应用,桌面客户端或其他事物),并且每个视图都具有其他视图,视图部件,小部件并因此需要其他视图模型。最后,有些人说REST-API可能不会提供任何不是真正的资源/实体的东西......
所以,你绝对正确的说jijter中的虚拟机实际上是DTO。但是,正如你所说,“DTO”存在一个问题,因为通常DTO只是一个无状态的传输对象,用于在没有任何逻辑的情况下封装两个或多个服务(或系统)之间的公共值。我们认为这也是自顶向下(REST)API驱动和自下而上的域驱动设计之间的架构问题,它们在JHipster应用程序中以某种方式混合。与你的意见类似,我认为JHipster使用DTOs的地方它应该是一个域对象(或实体)。例如。受管理的用户不是虚拟机或DTO,而是实体。我认为,这里的问题是有些人认为只有基于JPA的实体才是域对象,并且没有其他域对象(实体)。最后,我们决定引入一个名为ADO(API数据对象或访问数据对象)的新类型,因为我们没有找到适合的术语。一个ADO与一个VM,一个DTO甚至一个没有任何逻辑的实体进行比较。一个常见的“API层”只能读取和写入ADO。该层用于REST API控制器以及可供插件使用的Java API。这使我们有可能通过client-API-jar发布所有ADO,而无需添加任何特定的内部实体或域对象。由于REST-API和每个插件使用相同的ADO(因此具有相同的描述和结构),因此开发人员不会感到困惑,并且外部面向资源的层与使用其他业务逻辑的内部层相比,根据。
其他所有内部层的一部分,如实体,派生实体,子集或实体超集大部分都是域对象。因此,我们从内部层中删除了所有VM和DTO,业务逻辑等。总结:为了封装来自外部访问的内部(JPA)实体,我们使用ADO,因为除了视图之外可能还有其他的。这些ADO是根据jtimester虚拟机和DTO的。但是在公共API层的内部,我们从不使用任何DTO或VM,甚至不使用ADO,因为这些实体主要是域对象。
感谢您在这样的细节中描述您对虚拟机/ DTO的方法。我可以理解你的决定,并认为ADO是一个很好的方法。特别是,当你不仅有作为客户的观点。 –
由于JHipster通常用于包括UI在内的应用程序的完整脚手架,我认为VM是一个适合于此的术语。但无论如何,我认为特别是新的DTO部分需要在文档中变得更加清晰,或者在JHipster本身进一步调整。如果来自JHipster团队的人员参与了DTO/VM重构,可能会给出一些见解:) –
我认为在这个链接中他们解释了他们的观点,尽管我认为ADO是一个更成熟的解决方案:https: //jhipster.github.io/2016/08/17/jhipster-release-3.6.0.html –