MVC存储库模式 - 何时使用AutoMapper?

时间:2013-03-07 22:42:49

标签: asp.net-mvc model-view-controller asp.net-mvc-4

我们使用Telerik ORM生成我们的域模型,并将它们放在一个名为DAL的类库中。然后我们有我们的UI项目,它是一个MVC 4 Web应用程序。在这方面,我们有存储库和模型。这里的模型是视图模型,专门用于显示视图上的数据。

现在我的问题是:

  1. 存储库是否应该直接返回viewmodel?
  2. 视图模型应该转换为实体吗?
  3. 使用automapper有什么开销?应该在哪里使用?
  4. 如果我们不使用automapper转换到存储库中的viewmodel,我们可能会对db进行不同的调用以填充对象的每个部分。页面的视图模型可能包含联系人列表和选定的联系人。将通过一次调用存储库来填充所选联系人,并且将使用另一个调用填充联系人列表。此外,如果映射器位于存储库级别,如果我们只对“name和id”感兴趣,那么移除所有“额外字段”(例如性别)会不会更好?

    我听说存储库不应该返回视图模型,因为视图模型特定于UI,不应该涉及数据层。这是真的吗?

2 个答案:

答案 0 :(得分:2)

您的存储库应返回纯域对象。 ORM映射器应将这些输出为紧密映射到数据源的类。为了使您的存储库/控制器可以插入各种形式,如Web服务,Web应用程序和其他项目,没有任何麻烦,应该没有应用UI属性。

当您定位存储库接口的多个实现时,Automapper非常棒,就像使用DI容器一样。在将域对象转换为存储类对象或从存储类对象转换时,它非常有用。基本上它减少了翻译课程的需要。

在MVC.Model区域,您可能需要创建在UI中用作模型的域对象类的副本。随着项目的增长,您将看到这方面的优势,特别是如果您正在使用各种属性进行验证,显示,本地化等。当您拥有具有非常接近的命名约定的类时,Automapper等工具可以极大地提高工作效率。

如果在Mvc.Controller类中使用映射器将数据/控制器转换为MVC.Models,您也会看到效率的提高。

关键是要跨越应用程序边界的类中的属性名称。

答案 1 :(得分:0)

这是目前讨论的问题。 Jimmy Bogard消息是使用Automapper仅将域模型映射到视图模型。如果您想要将视图模型放回到域模型中,我建议您尝试Value Injecter