美文网首页.NET程序员dotNET
【C#】AutoMapper使用学习笔记

【C#】AutoMapper使用学习笔记

作者: 陈弟CD | 来源:发表于2016-08-30 20:39 被阅读3001次
    什么是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还有许多强大的功能,如自定义映射关系等;
    今后学习过程中如果使用到,也会以笔记的形式记录下来。

    相关文章

      网友评论

        本文标题:【C#】AutoMapper使用学习笔记

        本文链接:https://www.haomeiwen.com/subject/dafqettx.html