Spring MVC:服务层是否应返回特定于操作的DTO?

筹款:

在我的Spring MVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中。DTO被用作弹簧模板的支撑对象。

因此,我的服务如下所示:

userService.storeUser(NewUserRequestDTO req);

服务层将转换DTO-> Domain对象并完成其余工作。

现在我的问题是,当我想从服务中检索DTO来执行更新或显示操作时,我似乎找不到更好的方法来进行查找,而要使用多种返回不同DTO的方法进行查找。 。

EditUserRequestDTO userService.loadUserForEdit(int id);

DisplayUserDTO userService.loadUserForDisplay(int id);

但是这种方法有些不对劲。也许服务不应返回诸如EditUserRequestDTO之类的内容,并且控制器应负责从专用表单对象组装requestDTO,反之亦然。

确实有单独的DTO的原因是DisplayUserDTO的类型很强,是只读的,并且用户的许多属性都是数据库中查找表的实体(例如城市和州),因此DisplayUserDTO将具有字符串的字符串描述。属性,而EditUserRequestDTO将具有ID,这些ID将支持表单中的选择下拉列表。

你怎么看?

谢谢

GMK:

我喜欢精简的显示对象。它比仅显示其中的几个字段而构建整个域对象更有效。我使用了类似的模式,但有一个区别。我没有使用DTO的编辑版本,而是在视图中使用了域对象。它大大减少了在对象之间来回复制数据的工作。我还不确定现在是否要这样做,因为我正在使用JPA和Bean验证框架的注释,并且混合注释看起来很混乱。但是我不喜欢将DTO用于将域对象保持在MVC层之外的唯一目的。似乎很多工作没有太大好处。另外,阅读福勒对贫血物体的看法可能很有用它可能不完全适用,但是值得考虑。


第一次编辑:回复以下评论。

是的,我想一次对一个对象上的所有页面使用实际的域对象:编辑,查看,创建等。

您说您正在获取一个现有对象,并将所需的字段复制到DTO中,然后将DTO作为模型的一部分传递给视图页面的模板引擎(反之亦然,对于创建页面而言)。那买了什么?对DTO的引用不会比对整个域对象的引用少,并且您还有所有其他属性复制要做。没有规则说模板引擎必须在对象上使用每种方法。

如果可以提高效率(无需构建关系图),我将使用一个小的局部域对象,尤其是对于搜索结果。但是,如果对象已经存在,则不必担心将对象粘贴在模型中以呈现页面时它的大小是多少。它不会在内存中移动对象。它不会引起模板引擎压力。它只是访问所需的方法,而忽略其余的方法。


第二编辑:好点。在某些情况下,您可能需要视图的一组有限属性(即,不同的前端和后端开发人员)。在回复之前,我应该仔细阅读。如果要执行您想要的操作,则可能会以形式forEdit()和forDisplay()的User(或任何类)放置单独的方法。这样,您可以只从服务层获取用户,并告诉用户给自己使用有限的副本。我认为也许这就是我贫血对象评论所要达到的目标。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档