【问题标题】:In a ASP.NET MVC3 application, the ViewModel is filled by Service Layer or by the Controller?在 ASP.NET MVC3 应用程序中,ViewModel 是由服务层填充还是由控制器填充?
【发布时间】:2012-02-17 11:55:23
【问题描述】:

我有一个用 C# 和 Razor 编写的 ASP.NET MVC3。应用的架构分为数据访问层(EF类+Repository)、服务层、控制器、ViewModels和View。

我的 ViewModel 公开了一个方法 Fill,它接受数据集合作为参数以显示在 View 中。为了组件之间不存在耦合Fill方法必须从服务层控制器调用?

【问题讨论】:

    标签: asp.net-mvc-3 controller viewmodel service-layer coupling


    【解决方案1】:

    定义:模型(如在 MVC 中)= 服务层(在本例中)

    控制器应该是视图和模型之间的粘合剂。视图不应该知道模型,反之亦然。

    因此,您的问题的答案是控制器应包含用于将信息从模型移动到视图模型的所有逻辑。在视图模型中使用模型中的任何类都很好。

    更新对 cme​​ts 的回答

    就像我说的。我不知道你的类是什么样子或者你必须做什么来生成导航。

    1. 应使用控制器来组装视图模型所需的信息
    2. 控制器不应有任何业务逻辑

    这意味着您可能必须在服务层中创建新类才能实现这两个目标。

    【讨论】:

    • 感谢您的回答。正如我在对上述答案的回复中所写,如果我在 ViewModel 中使用导航属性,我会在 ViewModel 和 EF 之间创建耦合。我想知道在哪里提取这个值而不是创建耦合
    • 服务层中一个名为INavigationService的接口,用于填充视图模型。
    • 根据您的回答,因此应该是填充视图模型的服务层而不是控制器?
    • 没有。控制器可以使用INavigationService 获取信息,然后将其放入视图模型中。当我们不知道您的视图模型的外观或应该填充的信息的外观时,很难给出正确的答案。这个问题是非常具体的领域。但一般的答案是,应该由控制器来收集所需的信息。
    • 好的,我们继续。假设一个实现 INavigationService 的方法,查询存储库并具有一个 Product 对象和一个字符串对象。它将传递给控制器​​的对象类型是什么?
    【解决方案2】:

    最好从 ViewModel 中删除 Fill 函数,这样 ViewModel 就不会依赖于您的数据层。

    然后我会在控制器中使用类似 Automapper 的东西在返回视图之前将 DataObject 映射到 ViewModel。

    动作方法:

    public ActionResult Edit(int id)
    {
        var data = DataRepo.Get(id);
        var viewMode = Mapper.Map<ViewModel>(data);
        return View(viewModel);
    }
    

    【讨论】:

    • 谢谢。我的情况有点不同。假设我有一个具有导航属性的对象,并且我想通过使用导航属性来获取另一个表的值。你会如何解决这个问题?
    • 您是从 2 个表映射到一个 ViewModel 吗?
    • 简而言之,在我的产品类中,我有几个字段和一个字段 CategoryId 到表 Category 的外键。在我的 ViewModel 中,我拥有 Product 和 CategoryName 的所有字段。这意味着为了获得 CategoryName,我必须使用从 Product 到 Category 的导航属性。如果我在 ViewModel 中使用它,我会在后者和 EF 之间创建耦合
    • 我会为此在数据库中添加一个视图。那么您只需要一个 IO 即可获取 viewModel 所需的数据。
    • 问题是这个数据库视图是什么类型的对象给我回来的?
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多