arr*_*ges 7 java architecture spring spring-mvc n-tier-architecture
在我的Spring MVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中.DTO被用作弹簧形式的背衬物体.
因此我的服务看起来像这样:
userService.storeUser(NewUserRequestDTO req);
Run Code Online (Sandbox Code Playgroud)
服务层将翻译DTO - > Domain对象并完成剩下的工作.
现在我的问题是,当我想从服务中检索DTO来执行更新或显示我似乎无法找到更好的方法来执行它然后有多个方法进行查找返回不同的DTO类似.. .
EditUserRequestDTO userService.loadUserForEdit(int id);
DisplayUserDTO userService.loadUserForDisplay(int id);
Run Code Online (Sandbox Code Playgroud)
但这种做法并不合适.也许服务不应该返回像EditUserRequestDTO这样的东西,控制器应该负责从专用表单对象组装requestDTO,反之亦然.
究其原因也有单独的DTO的是DisplayUserDTO是强类型为只读,也有一些是从查找表的实体在DB(如市,州)的用户很多属性,因此DisplayUserDTO本来的字符串描述属性,而EditUserRequestDTO将具有将支持表单中的选择下拉列表的id.
你怎么看?
谢谢
我喜欢精简的展示对象。它比构建整个域对象只是为了显示它的几个字段更有效。我使用了类似的模式,但有一点不同。我没有使用 DTO 的编辑版本,而是仅使用视图中的域对象。它显着减少了对象之间来回复制数据的工作。我现在还没有决定是否要这样做,因为我正在使用 JPA 和 Bean 验证框架的注释,并且混合注释看起来很混乱。但我不喜欢将 DTO 仅仅用于将域对象排除在 MVC 层之外。似乎做了很多工作却没有多少好处。另外,阅读福勒对贫血对象的看法可能会有所帮助。它可能不完全适用,但值得思考。
第一次编辑:回复下面的评论。
是的,我喜欢对一次对单个对象进行操作的所有页面使用实际的域对象:编辑、查看、创建等。
您说您正在获取现有对象并将所需的字段复制到 DTO 中,然后将 DTO 作为模型的一部分传递到视图页面的模板引擎(对于创建反之亦然)。这能给你带来什么?对 DTO 的引用并不比对完整域对象的引用轻,而且您还需要进行所有额外的属性复制。没有任何规则规定模板引擎必须使用对象上的每个方法。
如果可以提高效率(无需构建关系图),我会使用一个小的部分域对象,特别是对于搜索结果。但是,如果该对象已经存在,则当您将其粘贴到模型中以呈现页面时,不必担心它有多大或有多复杂。它不会在内存中移动对象。它不会导致模板引擎压力。它只访问它需要的方法并忽略其余的。
第二次编辑:好点。在某些情况下,您希望视图可用的属性集有限(即不同的前端和后端开发人员)。在回复之前我应该仔细阅读。如果我要做你想做的事,我可能会在用户(或任何类)上放置单独的方法,形式为 forEdit() 和 forDisplay()。这样你就可以从服务层获取 User 并告诉 User 给你它自己的使用有限的副本。我想也许这就是我对贫血对象评论的目的。
| 归档时间: |
|
| 查看次数: |
7318 次 |
| 最近记录: |