微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在我的 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()的用户(或任何类)上放置单独的方法.这样你就可以从服务层获取用户并告诉用户使用自己的有限副本.我想也许这就是我用贫血物体评论所达成的目标.

原文地址:https://www.jb51.cc/java/129532.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐