我有一个可以在Controllers,View和Core中使用的viewmodel。 Core是一个单独的项目,而Controllers和View在Web项目中。放置ViewModel的最佳位置在哪里,是在Web项目中还是在Core中,还是我只需要为View Model创建一个单独的项目?
答案 0 :(得分:1)
我有一个可以在Controllers,View和Core中使用的viewmodel。
没有。您没有在Core中使用它。谷歌“关注点分离”。视图模型的职责是在视图中表示模型(核心项目)。它不应该用于任何其他事情。我在这里写过视图模型:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/
控制器有责任从模型中取出所有东西(核心 项目)并创建一个合适的视图模型。
将视图模型放在某处以便可以在Core中使用它给出了多个改变的理由,这将破坏单一责任原则(五个SOLID原则之一)。这意味着您的应用程序的某些部分会受到您所做的每一项更改的影响,并且可能会导致小的变通方法或快速修复,这将在一年内给您带来维护噩梦。
<强>更新强>
使用AutoMapper的示例:
public class FlairController
{
public FlairController(IYourServiceOrRepository repos)
{
}
public ActionResult Details(int id)
{
SomeCoreObject entity = _repos.Get(id);
FlairViewModel model = new FlairViewModel();
Mapper.Map(entity, model);
return View(model);
}
}
您的示例代码(在注释中)是没有映射框架时方法的样子。
答案 1 :(得分:0)
视图模型通常是具有UI格式数据的模型的包装器。您应该将模型类保留在Web项目中的Core项目和视图模型类中。
View Model类的构造函数可以获取模型类的实例(以及填充视图所需的任何其他对象)并生成正确的视图数据。例如,如果模型具有DateTime对象,则视图模型可以具有相应的String属性,该属性包含要显示的格式的DateTime。
答案 2 :(得分:0)
由于ViewModel特定于Views,我通常会在我的UI项目下创建一个ViewModel文件夹并将其保留在那里。
我将创建一个单独的服务层(另一个项目),用于在我的ViewModel和实体模型之间桥接数据。 My Controller Action方法使用ViewModel对象调用服务层。