0

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

4

3 回答 3

1

我有一个可以在控制器、视图和核心中使用的视图模型。

不,您没有在核心中使用它。谷歌“关注点分离”。视图模型的职责是在视图中表示模型(核心项目)。它不应该用于其他任何事情。我在这里写过关于视图模型的文章:http: //blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

控制器负责从模型(核心项目)中获取所有内容并创建适当的视图模型。

将视图模型放在某个地方以便它可以在核心中使用给了它不止一个改变的理由,这将打破单一责任原则(五个 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);
    }
}

您的示例代码(在评论中)是该方法在没有映射框架的情况下的样子。

于 2012-04-24T05:52:56.823 回答
0

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

在此处输入图像描述

我将创建一个单独的服务层(另一个项目),用于在我的 ViewModel 和实体模型之间桥接数据。我的控制器操作方法使用 ViewModel 对象调用服务层。

于 2012-04-24T03:27:43.860 回答
0

视图模型通常是具有 UI 格式化数据的模型的包装器。您可能应该将模型类保留在核心项目中,并将视图模型类保留在 Web 项目中。

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

于 2012-04-24T03:23:24.517 回答