【问题标题】:MVC Best Practice: Where to do mapping between modelsMVC 最佳实践:在哪里做模型之间的映射
【发布时间】:2012-02-27 13:11:19
【问题描述】:

我有一个大致如下组织的 MVC 项目:

  1. 项目 1:MVC 应用(ViewModels、Controller、Actions、UI-stuff)
  2. 项目 2:域模型(域类、行为、数据访问(持久层、存储库)

我的问题是在哪里进行映射和数据访问(如何组织代码)。

definition(据我了解)控制器应将请求映射到正确的视图并尽可能瘦。

我在基本映射上使用 Automapper,并在控制器中执行此操作,但对于更复杂的映射,我发现自己进行映射更容易。

我主要有两个地方放这个代码:

  1. 在控制器中:

这很容易变得非常混乱,特别是如果我需要从多个存储库中获取信息、创建选择列表等等。

  1. 在 ViewModel 中:

这感觉更好,但我不喜欢在模型中实例化 Repositories 和 UnitOfWork。不知道是否属于那里。

现在我正在做一些介于两者之间的事情:

我让 ViewModel 将所需的存储库作为构造函数 参数,然后我在那里进行映射。我实例化 控制器中的 Repositories/UnitOfWork 并将其传入。好的 事情是我可以为存储库使用一个接口,所以 ViewModel 不需要关心实现。

但是,在网络上的示例中,我总是在控制器中看到所有这些代码,这让我想知道 - 正确的做法是什么?

【问题讨论】:

    标签: asp.net-mvc model controller mapping


    【解决方案1】:

    为了在 ViewModel 中执行此操作,这意味着您的 viewmodel 必须了解您的其他对象。这不好。 ViewModel 应该尽可能地对外部依赖项保持沉默。

    您应该在控制器中进行映射。

    【讨论】:

    • 好的,谢谢。这很清楚。所以我用控制器中的数据填充视图模型并在模型中执行其余的逻辑?即创建一个选择列表以仅使用一个 getter 的 SelectList 属性查看数据,从模型中的现有数据创建列表?
    • @cfs - 对此有不同的看法。我将 ui 模型(模型文件夹)视为严格的视图模型。我有一个单独的业务逻辑层,用于管理域模型。我调用业务层并取回数据,然后将其映射到我的视图模型。
    • 感谢您的洞察力,这可能会有所帮助,因为我发现这里很难走中间道路,在控制器中没有做太多事情,不会以贫乏的域模型结束,而且仍然对于一些与域无关的视图,我需要一些特别的东西。我可能不得不在某个时候重构它......
    【解决方案2】:

    您可以利用 ActionFilter 属性来执行映射过程。请参阅 How to do MVC - View Model 上的 Jimmy Boggard 的博客。我个人觉得这是一种干净的方法,并且摆脱了控制器中的映射代码。

    【讨论】:

    • 我读过,我非常喜欢它,但他真的为每个视图制作了一个 ViewModel,而且他真的知道 AutoMapper 的所有细节。我对在每种情况下都使用 Automapper 并不完全有信心,特别是因为我发现自己在最复杂的情​​况下,如果我自己进行映射,我可以更好地控制。不过谢谢你的提示。
    • 欢迎 cfs,您还可以使用自己的名为 CustomMapFilter 的 ActionFilter 属性,您可以在其中注入映射逻辑并维护另一个 ActionFilter 属性,以并行使用 AutoMapper。希望能帮助到你。如果我错了,请纠正我
    • 我发现这种方法在一些更复杂的场景和更复杂的模型中不起作用。不过,只是一个意见。
    • @Tanizah 我不认为你错了,但它实际上只是隐藏了我认为的映射并使控制器看起来更干净(它仍然存在),如果你得到足够的 CustomMapFilters除非您可以以某种方式重用其中的代码,否则也会有点混乱。
    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2021-07-24
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多