我想在Spring 3中开始讨论分离纯模型和UI模型。
纯模型我指的是我从数据库中检索的主要对象/对象,比方说一些“用户帐户”。它包含足够的信息以在HTML视图中显示它或将其传递给Web服务。
通过UI模型,我指的是在UI中使用该对象所需的所有辅助内容。例如。如果“用户帐户”具有“状态”,那么我需要从数据库中获取所有“状态”,例如组合框。这些观点很棘手,在某些情况下,它们需要更多信息,而在其他情况下则更少。能够通过添加诸如“全部选择”之类的项目来改变一些列表也是很好的,这是纯粹的UI内容(并且从视图模板中不太方便)。
我听说有所谓的Model-View-ViewModel模式,似乎解决了这些问题,但我从未尝试过它的实现。
我现在使用的解决方案是将逻辑分解为两个服务 - 一个用于纯模型,一个用于UI模型。它看起来像这样:
@RequestMapping(value="app/user_accounts/{id}")
public String getUserAccount(@PathVariable("id") String id) {
service.getUserAccount(id); // Gets main object and puts it into model
presenter.formUserAccount(); // Gets all classifier for main object's properties
return "user_account";
}
我不喜欢的是视图及其所谓的视图模型彼此不相关。我可以调用presenter.formUserAccount()并返回完全不相关的视图名称。
我看到的另一种方法类似于Spring控制器注释。我们有注释为@ViewModels的类和映射到视图名称的方法。拦截器在呈现某个视图之前查找并执行这些方法。这些看起来很优雅,但需要很多代码编写。
你会如何解决这个问题?
答案 0 :(得分:1)
我一直在Grails的上下文中考虑这个问题,它基于Spring MVC。我的方法是使用命令对象作为视图模型,因为它为您提供了在视图模型中所需的数据绑定和验证功能。使用命令对象,您可以使用命令对象将视图属性映射到域对象,从而将“纯模型”(或域模型)从视图中抽象出来。