# 什么是AutoMapper?

AutoMapper是一个能自动完成对象与对象之间转化的开源库;通常DTO(Data Transfer Object数据传输对象)与Model之间的常规转化做法会使代码相当的冗长,AutoMapper作者为了减少这种工作量,写了这个开源库,使DTO与Model之间能够自动的完成转化。

在学习过程中查阅了很多资料,帮助比较大的一片博文为:http://www.codeproject.com/Articles/61629/AutoMapper 全英文对我来说压力还是挺大的,但是还是一点点啃下来了。

# 基础使用方法:

public class DTO
{
    public string userName {set; get;}
    public string age {set; get;}
    public string job {set; get;}
}
public class Model
{
    public string userName {set; get;}
    public string age {set; get;}
    public string job {set; get;}
}

上述的DTO与Model,一般情况下,DTO为直接映射数据库中的数据,Model为交互数据,那么如何把两着对象里的数据进行映射呢?

  • 通常的做法为:
//DTO与Model之间可以这样转化,因为的对象的属性都为string类型
DTO.userName = Model.userName;
DTO.age = Model.age ;
DTO.job = Model.job ;
  • 使用AutoMapper转化:
//首先需要先为DTO与Model之间定义一个映射关系
Mapper.CreateMap<DTO, Model>();
DTO dtoData = GetdtoDataFromDB();
Model modelData = Mapper.Map<DTO, Model>(dtoData );

这里的DTO对象就被AutoMapper自动转化成了Model对象,所以modelData中的userName、age、job的值即为GetdtoDataFromDB()方法取出来的值。

# 遇到的坑点

在实际的项目中使用AutoMapper对DTO与Model进行自动转化的时候遇到了一个坑点,其实也不算是坑点,只是一个我没有注意到的地方,这里做一个记录,加深自己的印象。 DTO与Model的结构如下:

// DTO
public class DTO
{ 
    public string userName {set; get;} 
    public string age {set; get;} 
    public string job {set; get;}
    public AddressDTO address {set ; get;}
}
public class AddressDTO{ 
    public string country {set; get;} 
    public string province {set; get;} 
}
// Model
public class Model
{ 
    public string userName {set; get;} 
    public string age {set; get;} 
    public string job {set; get;}
    public AddressModel address {set ; get;}
}
public class AddressModel{ 
    public string country {set; get;} 
    public string province {set; get;} 
}

写完了这个两个对象,于是便开始写与上面的一样开始用AutoMapper进行自动转化

Mapper.CreateMap<DTO, Model>();
DTO dtoData = GetdtoDataFromDB();
Model modelData = Mapper.Map<DTO, Model>(dtoData );

写完了,心里很高兴,心里感叹着AutoMapper的强大。结果项目一跑起来报错,报错结果为:(图片为另一篇博客贴来的) 盗图.png 从报错结果分析,原因是我没有配置正确,如何解决这个问题呢? 很简单,像这样包含子对象之间的转换,只要把子对象之间也使用AutoMapper来定义映射关系不就行了吗? Action

Mapper.CreateMap<DTO, Model>();
Mapper.CreateMap<AddressDTO , AddressModel >();//子对象映射关系
DTO dtoData = GetdtoDataFromDB();
Model modelData = Mapper.Map<DTO, Model>(dtoData );

这样,项目就成功的跑起来了,AutoMapper的一个好处之一:如果我们需要一个新的字段,比如在DTO中新增一个

public string sex {set; get;}

这个时候如果是常规的写法,我们需要在转化的地方手动加上

DTO.sex = Model.sex;

当项目越来越大的时候,我们做这种更改需要极其小心。 而使用AutoMapper来实现自动转化,只需要在DTO中与Model中添加需要新增的字段即可,避免了手写代码的风险。

# 最后

AutoMapper还有许多强大的功能,如自定义映射关系等; 今后学习过程中如果使用到,也会以笔记的形式记录下来。

上次更新: 2019年 12月 28日 15:53:50