2012-04-24 130 views
0

我有一个viewmodel可以在控制器,视图和核心中使用。核心是一个独立的项目,而控制器和视图在Web项目中。放置ViewModel的最佳位置在哪里,它是在Web项目还是在Core中,还是我需要为View Model创建一个单独的项目?在哪里把ViewModel

回答

0

视图模型通常是包含具有UI格式数据的模型的包装。您可能应该将模型类保留在Web项目中的Core项目和视图模型类中。

您的View Model类的构造函数可以接受模型类(以及任何其他需要填充视图的对象)的实例并生成正确的视图数据。例如,如果你的模型有一个DateTime对象,那么你的视图模型可以有一个相应的String属性,它包含你想要显示的格式的DateTime。

+0

那么如何在核心中使用视图模型?我需要参考Web项目类吗? – user335160 2012-04-24 03:29:10

+0

反过来。 Web项目引用您的核心项目。我已经更新了我的答案 – 2012-04-24 04:59:39

+0

好吧,我现在很困惑,因为我使用了自动映射器来映射ViewModel和Model。如果我在构造函数中实例化模型,似乎我不需要Automapper? – user335160 2012-04-24 05:48:20

0

由于ViewModel特定于视图,我通常会在我的UI项目下创建一个ViewModel文件夹并将其保留在那里。

enter image description here

我将为我的ViewModels和实体模型之间的桥接数据一个单独的服务层(另一个项目)。我的Controller Action方法使用ViewModel对象调用服务层。

+0

其实我们有相同的设计,你可以给我一个你的服务层和控制器的示例代码,返回一个ViewModel?对我来说正确理解。 – user335160 2012-04-24 03:47:57

1

我有一个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); 
    } 
} 

你的示例代码(在评论)是如何该方法看起来像未经映射框架。

+0

这里是我的项目结构 网站 - 查看 控制器 - 所有控制器都在这里(如果我将它放在这里,会感到困惑) Core-包含自动映射器配置,映射器类,ModelView映射和服务(ViewModel正在使用此处返回我需要的数据) DataAccess-存储库类 Model-generated by EF – user335160 2012-04-24 06:27:37

+0

视图模型和核心模型之间的视图模型和自动映射器配置应放置在UI(MVC3项目)中,因为Core不应该知道任何东西在UI层。您的服务不应该使用视图模型,因为它们专门用于显示HTML – jgauffin 2012-04-24 06:55:01

+0

您能否请您在这里提供一个关于您提到的方法的示例代码,实际上我现在非常困惑,因为我正在考虑您所说的是,你的控制器有此示例代码返回查看( 视图, 新FlairViewModel { 晚餐= dinners.ToList(), LOCATIONNAME = string.IsNullOrEmpty(location.City) “你”:?的String.Format(“{ 0},{1}“,location.City,location.RegionName) } ); – user335160 2012-04-24 08:22:39