我今天正在进行代码审查,看到有人拥有视图模型类,除了数据之外,还包含不同的方法,例如
GetTable, GetPdf, LoadSomeData etc.
我个人不喜欢它,因为喜欢有一个“普通”视图模型类,只包含属性并将逻辑放入Controller或者附加服务。
但在审查时,我无法找到好的论据。
您如何看待,在视图模型类中使用逻辑是一种好方法(样式)吗?什么是利弊?
编辑:这是ASP.net MVC2应用程序。 编辑:此类代码的示例(仅从头部开始)..public ActionResult SomeAction()
{
var model = new ViewModel();
model.LoadSomethingFromSomething();
model.AnotherMethod();
return View(model);
}
答案 0 :(得分:2)
分离关注点和单一责任主体的原则规定视图中应该包含的唯一“逻辑”应该是操纵视图的方式显示数据。其他一切都应该在控制器中。在语义上,视图做了一件事 - 显示数据,与显示所述数据无关的任何事情 - 即操纵数据,格式化数据,加载数据,转换数据等应该由控制器处理。
在现实世界中,我们并不总是拥有理想主义的奢侈品,但在理想世界中,它应该是它应有的方式。 最少惊喜的原则表示代码应该在最不可思议的地方找到它。如果我(作为代码维护者)需要修复某些东西,我需要能够快速找到它 - 如果不是逻辑指示我会找到它,它会为我快速有效地完成任务提供不必要的障碍。
如果GetTable适用于为视图加载表构造(即HTML表),那么可能它是相关的,如果我们谈论从数据库获取表数据,那么它不是。
答案 1 :(得分:1)
你的问题对我来说很模糊。当您说视图模型时,您是指从视图消耗的域模型构建的视图特定模型吗?在这种情况下,我同意视图模型应该非常简单。观点不应该“思考”太多(理想情况下,它根本不应该“思考”)。从视图中调用方法(未在帮助程序中定义),甚至在视图中进行分支,对我来说是一种代码味道。
IMO,控制器也应该轻薄。我喜欢我的模型中的大部分逻辑以及数据访问层。仅仅取决于我们所谈论的逻辑类型。答案 2 :(得分:1)
我曾经认同完全“愚蠢”模型的想法.I。那些不做任何事情的人。然而,在实践中使用这个想法后,我发现它并不理想。我现在赞同viewModels应该知道如何从其他对象创建自己的想法。
即
public ActionResult SomeAction(int? id)
{
var serviceModel = _myService.Get(id ?? 0);
var model = new ViewModel(serviceModel);
return View(model);
}
基本上,不是在模型中添加方法,而是创建几个构造函数,这些构造函数接收在视图模型创建中使用的对象。这可以释放您的控制器和放大器。通过了解viewModel如何工作的任何事情来服务(意味着没有对象映射代码包含所有内容)。
然后,要从viewModel中获取对象,可以执行以下操作:
[HttpPost]
public ActionResult SomeAction(ViewModel model)
{
_myService.Update(model.MapToServiceModel() );
return SomeAction(model.id);
}