我应该在哪里放置automapper代码?

时间:2014-02-07 05:28:49

标签: c# automapper

我在Asp.net mvc应用程序中使用Automapper。 我对使用automapper

有疑问

从大量的示例代码中,我看到人们直接使用mapper Mapper.Map<Target>(source),我不确定这是不是很好,在我的观点中,我想包装{{1}代理对象中的代码,而不是让它直接与Mapper对话

controller

在此示例中,控制器对类 public BankflowData CreateBankflowAdjustments(BankflowData addedBankFlow) { var bankflow = Mapper.Map<Bankflow>(addedBankFlow); var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow); return Mapper.Map<BankflowData>(newBankflow); } 一无所知,它只知道dto Bankflow

我想知道对于使用AutoMapper的应用程序来说这是一个好习惯吗?

2 个答案:

答案 0 :(得分:4)

对于上一个问题,我回答了ASP.NET MVC with service layer and repository layer, where should the interfaces be defined?

在我的回答中,我解释说:

  

[...]我有一个典型的结构:

     
      
  • MyProject.Core
  •   
  • MyProject.Domain
  •   
  • MyProject.DependencyInjection
  •   
  • MyProject.Infrastructure
  •   
  • MyProject.Web
  •   
  • MyProject.Tests
  •   
     

基础设施层包含有关日志记录,电子邮件和数据访问的信息。它将包含我的ORM选项。这不是商业逻辑的东西,也不是UI的东西。这是我完成任务的解决方案的铁路。它在外层,但它只引用Core。

在我的情况下,基础设施层也包含Automapper。核心定义了一个简单的接口(比如说IAutoMapper),基础设施中存在的一个简单对象实现了它,并且可以通过依赖注入将对象传递给UI层。

然而 Jimmy Bogard(Automapper的创建者)在AutoMapper 3.0, Portable Class Libraries and PlatformNotSupportedException中说道

  

[...] 如果你抱怨UI项目不应该直接引用这个库,因为一些愚蠢的虚假建筑师的理由(甚至引用某种臭的圆形蔬菜),我会开车去你家打你傻。脱下你的高马,开始提高工作效率。

据我了解,他的意思是可以从UI层引用Automapper。当他说“某种臭的圆形蔬菜”时,他当然指的是吉米并非忠实的Onion Architecture

答案 1 :(得分:3)

如果您的应用程序中有服务层,最好将automapper放在服务层中。在任何情况下尝试使用扩展方法通过automapper映射您的对象,如下所示:

public static class Mapping
{
public static BankflowData CreateBankflowAdjustments(this BankflowData addedBankFlow)
      {
         var bankflow = Mapper.Map<Bankflow>(addedBankFlow);
         var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow);
         return Mapper.Map<BankflowData>(newBankflow);
      }
}

它将使您的代码更具可读性并将您的问题分开。以this获取更多信息