在我的 Spring MVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中. DTO被用作弹簧形式的背衬物体.

因此我的服务看起来像这样:

userService.storeUser(NewUserRequestDTO req);

服务层将翻译DTO – >域对象并完成剩下的工作.

现在我的问题是,当我想从服务中检索DTO来执行更新或显示我似乎无法找到更好的方法来执行它然后有多个方法进行查找返回不同的DTO类似.. .

EditUserRequestDTO userService.loadUserForEdit(int id);

displayUserDTO userService.loadUserFordisplay(int id);

但是对于这种方法有些不对劲.也许服务不应该返回像EditUserRequestDTO之类的东西,控制器应该负责从专用表单对象组装requestDTO,反之亦然.

确实有单独DTO的原因是displayUserDTO强类型是只读的,并且用户的许多属性都是db中查找表中的实体(如城市和州),因此displayUserDTO将具有该字符串的描述.属性,而EditUserRequestDTO将具有将支持表单中的选择下拉列表的id.

你怎么看?

谢谢

解决方法

我喜欢精简的显示对象.它比构建整个域对象只是为了显示它的几个字段更有效.我使用了类似的模式,但有一点不同.我只使用了视图中的域对象,而不是使用DTO的编辑版本.它显着减少了在对象之间来回复制数据的工作.我现在还没有决定是否要这样做,因为我正在使用JPA和Bean Validation Framework的注释,并且混合注释看起来很混乱.但我并不喜欢使用DTO只是为了将域对象保留在MVC层之外.似乎很多工作没有太大的好处.此外,阅读Fowler对 anemic objects的看法可能会有所帮助.它可能不完全适用,但值得考虑.

第一编辑:回复以下评论.

是的,我喜欢将实际域对象用于一次操作单个对象的所有页面:编辑,查看,创建等.

您说您正在获取现有对象并将所需字段复制到DTO中,然后将DTO作为模型的一部分传递给视图页面的模板引擎(反之亦然,用于创建).这会给你带来什么?对DTO的引用的权重不小于ref对完整域对象的权重,并且您要进行所有额外的属性复制.没有规则说你的模板引擎必须使用对象上的每个方法.

我会使用一个小的部分域对象,如果它提高效率(没有建立关系图),特别是对于搜索的结果.但是,如果对象已经存在,那么当您将其粘贴到模型中以呈现页面时,不要担心它的大小或复杂程度.它不会在内存中移动对象.它不会引起模板发动机的压力.它只是访问它需要的方法而忽略了其余的方法.

第二次编辑:好点子.在某些情况下,您可能希望视图可用的有限属性集(即不同的前端和后端开发人员).在回答之前我应该​​仔细阅读.如果我打算做你想做的事情,我可能会在表单forEdit()和fordisplay()的用户(或任何类)上放置单独的方法.这样你就可以从服务层获取用户并告诉用户使用自己的有限副本.我想也许这就是我用贫血物体评论所达成的目标.

java – Spring MVC:服务层应该返回特定于DTO的操作吗?的更多相关文章

  1. PHP中的数据传输对象,许多具有相同上下文名称的类

    我刚才发现有这种DTO模式.我怀疑是否它们很有用.我的意思是,我应该将所有域对象映射到相应的DTO对象并将它们分配给查看域对象本身吗?

  2. POCO,DTO,DLL和贫血域模型

    )),并由MartinFowler在07年由贫血领域模型出现。通过缺乏理解,我想我已经创造出了这些贫血域模型之一。所以通常我会这样创建一个dto:并将其传递给bll层,如下所示:这又反过来执行一些逻辑,并将其传递给dal层,如下所示:从我的理解,要使我的dto进入POCO,我需要使业务逻辑和行为(方法)成为对象的一部分。实现这一点的POCO方式是以这种方式设计你的界面:这是更可发现的,因为开发者知道在哪里寻找飞机飞行。

  3. java – 创建新的实例类引用

    我有一个这样的枚举:所有这些dto类都扩展了相同的抽象类:这将是TestADto的示例Dto实现:是否有可能在枚举引用类中创建这些的具体实例,而不需要知道它具体是什么?让我说在一个函数中的某个点,即时通讯具有Enum_A.现在我想创建一个dto实例.对此最好的方法或模式是什么?我想要达到的一切是将dto名称分配给枚举,以便稍后在某些特定点创建它.但如果可能的话,不要创造巨大的条件……

  4. java – 在创建,更新和获取休息端点中相同/不同的DTO对象?

    考虑使用UserDTO类和UserController公开端点来创建,更新和获取用户.在UserDTO类中具有id属性对于创建和更新没有意义.如果我使用swagger或其他自动生成的api文档,那么它会显示id可以在createendpoint中传递.但系统不使用它,因为ID是在内部生成的.如果我看看get那么可能我可以摆脱id属性,但它肯定是在列表用户端点.我想在get/list端点返回内部用户域对象.这样我就可以从UserDTO类中删除id属性.我可以为此采用更好的选择吗?

  5. java – Spring MVC:服务层应该返回特定于DTO的操作吗?

    在我的SpringMVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中.DTO被用作弹簧形式的背衬物体.因此我的服务看起来像这样:服务层将翻译DTO–>域对象并完成剩下的工作.现在我的问题是,当我想从服务中检索DTO来执行更新或显示我似乎无法找到更好的方法来执行它然后有多个方法进行查找返回不同的DTO类似...但是对于这种方法有些不对劲.也许服务不应该返回像EditUserRequ

  6. c# – 如果在Base DTO映射中配置了ExplicitExpansion,Automapper 5.2将忽略它

    )崩溃有关.在下面的第一个单元测试中演示了崩溃堆栈跟踪.我会在另一个问题中询问它,或者更确切地说是在bug跟踪器中创建一个问题,因为崩溃肯定是一个bug.UnitTest2.cs–修复了IvanStoev的回答UPD2.上面更新的问题肯定无法在外面修复,请参阅接受的答案下的评论.这是AutoMapper本身的问题.如果您迫不及待地想要修复更新的问题,可以使用以下简单差异来制作AutoMapper补丁:https://github.com/moudrick/AutoMapper/commit/6500542

  7. c# – 使用DTO时的PATCH

    我正在研究asp.net核心webAPi和EF核心,并希望实现“更新”操作.我搜索了正确的方法来处理它,并看到我应该使用jsonPatch.问题是我通过我的API暴露了DTO,如果我使用jsonPatch:然后我需要在DTO上应用补丁,我不能在模型实体上应用它,而不创建新的实体.我也读过Odata.Delta,但它仍然不适用于asp.net核心,而且–我不认为它有一个内置的解决方案来处理dto所以,现在–我应该使用POST并在查询中发送带有已更改属性列表的DTO,或者–有更优雅的解决方案吗?

  8. c# – DTO.属性还是字段?

    我需要创建一些DTO类来跨WCF传输业务对象.由于这些只是没有功能的数据包,有什么理由我不能只使用字段,还是有一些很好的理由将它们作为属性正确地公开?

  9. .net – 跟踪复杂对象图中的变化

    我开始考虑在断开的应用程序中跟踪复杂对象图中的变化.我已经找到了几个解决方案,但是我想知道是否有最佳实践或者使用什么解决方案,为什么?

  10. java – DTO模式是否被弃用?

    在完整的JavaEE应用程序集群中,DTO模式仍然是有效的选项?如果没有,那么DTO模式是不是逐渐消失,不应该在新的应用程序中使用?.>CoreJ2EEPatterns–TransferObject编辑2:解释了MartinFowler解释使用DTO设计的主要原因的另一个信息来源>LocalDTO结论:DTO不是一种反模式.只有当您需要将数据从一个子系统传递到另一个子系统时,才能使用DTO,并且它们没有默认或标准的通信方式.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部