AutoMapper——Map之实体的桥梁(二)

       我们在之前的文章中提到了ORM,然后用到了EF,今天我们再介绍一种实体转换关系的模型AutoMapper

一、是什么

        AutoMapper是一个.NET的对象映射工具。主要作用是进行领域对象与贫血模型之间的转换、数据库查询结果映射至实体对象。

         什么是贫血模型?贫血模型(DTO,Data Transfer Object,就是说只包含属性,只能保存必须的数据,木有其它任何的多余的方法数据,专门用于数据传递用的类型对象)。

        那这是什么意思呢,比如在ORM中,与数据库交互用的Model模型是具有很多属性变量方法的实体。而当我们与其它系统(或系统中的其它结构)进行数据交互时,出于耦合性考虑或者安全性考虑或者性能考虑(总之就是各种考虑),我们不希望直接将这个Model模型传递给它们,这时我们会创建一个贫血模型保存数据并传递

       也正是这个原因,我们才需要在Model模型和DTO实体之间做相互的转换。

二、怎么用

    1、两个实体的属性完全一样

         在应用它之前我们先要在vs中引用它。点击工具下的库程序包管理器,选择程序包管理控制台!然后输入Install-PackageAutoMapper。或者右击解决方案,在nuget管理中找到AutoMapper,安装, 然后在引入AutoMapper,就可以放心的使用了

         Model实体

<span style="font-size:18px;">namespace testautomapper  
{  
    //学生源实体类  
    public class studentSource  
    {  
        public string name { get; set; }  
        public int age {get;set;}  
        public string sex { get; set; }  
    }  
}</span>  
        DTO实体
<span style="font-size:18px;">namespace testautomapper  
{  
    //学生目标实体类  
    public class studentPurpost  
    {  
        public string name { get; set; }  
        public string age { get; set; }  
        public string sex { get; set; }  
    }  
}</span>  
         单个实体转换过程

<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //创建映射规则  ,第一个参数为源实体(Model),第二个为目标实体(DTO)
            Mapper.CreateMap<studentSource, studentPurpost>();  
            //创建一个源实体  
            studentSource sSource = new studentSource  
            {  
                name = "崔晓光",  
                age = 23,  
                sex = "男"  
            };  
            //进行转换  ,得到目标实体(DTO)
            var sPurpost = Mapper.Map<studentPurpost>(sSource);  
            Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age);  //输出目标实体的属性
        }  
    }  
</span>}</span>  

         多个实体转换过程(实体集)

<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //创建一个转换关系规则  
            Mapper.CreateMap<studentSource, studentPurpost>();  
            //创建一个实体集合  
            List<studentSource> list = new List<studentSource>();  
            studentSource s = new studentSource  
            {  
                name = "cuixiaoguang",  
                age = 13,  
                sex = "nan"  
            };  
            list.Add(s);  
  
            //进行转换  
            List<studentPurpost> sPurpostList = Mapper.Map<List<studentSource>, List<studentPurpost>>(list);  
            Console.WriteLine(sPurpostList[0].age + sPurpostList[0].name + sPurpostList[0].sex);  
        }  
    }  
}</span></span>  

    2、两个实体的属性不完全一样

         Model实体

<span style="font-size:18px;">namespace testautomapper  
{  
    //学生源实体类  
    public class studentSource  
    {  
        public string Sname { get; set; }  
        public int age {get;set;}  
        public string sex { get; set; }  
    }  
}</span> 

         DTO实体

<span style="font-size:18px;">namespace testautomapper  
{  
    //学生目标实体类  
    public class studentPurpost  
    {  
        public string Pname { get; set; }  
        public string age { get; set; }  
        public string sex { get; set; }  
    }  
}</span>  

         实体转换(实体集合同理)

       AutoMapper使用ForMember来指定每一个字段的映射规则: 
       引用:The each custom member configuration uses an action delegate to configure each member.
      还好有强大的lambda表达式,规则的定义简单明了。 

<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //创建映射规则  ,第一个参数为源实体(Model),第二个为目标实体(DTO)
            Mapper.CreateMap<studentSource, studentPurpost>();  
            //定义实体中不同的属性,使之对应
            map.ForMember(d => d.Sname, opt => opt.MapFrom(s => s.Pname)); 
            //创建一个源实体  
            studentSource sSource = new studentSource  
            {  
                Sname = "崔晓光",  
                age = 23,  
                sex = "男"  
            };  
            //进行转换  ,得到目标实体(DTO)
            var sPurpost = Mapper.Map<studentPurpost>(sSource);  
            Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age);  //输出目标实体的属性
        }  
    }  
</span>}</span> 

    3、两个实体的属性完全不一样

         Model实体

<span style="font-size:18px;">namespace testautomapper  
{  
    //学生源实体类  
    public class studentSource  
    {  
        public string Sname { get; set; }  
        public int Sage {get;set;}  
        public string Ssex { get; set; }  
    }  
}</span> 

         DTO实体

<span style="font-size:18px;">namespace testautomapper  
{  
    //学生目标实体类  
    public class studentPurpost  
    {  
        public string Pname { get; set; }  
        public string Page { get; set; }  
        public string Psex { get; set; }  
    }  
}</span>  

         实体转换

         AutoMapper使用ConstructUsing来指定每一个字段的映射规则

<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //创建映射规则  ,第一个参数为源实体(Model),第二个为目标实体(DTO)
            Mapper.CreateMap<studentSource, studentPurpost>();  
            //定义实体中所有不同的属性,使之对应
            
            map.ConstructUsing(s => new studentPurpost
                                          {  
                                              Pname= s.Sname,  
                                              Page= s.Sage,  
                                              Psex= s.Ssex
                                          }); 
            //创建一个源实体  
            studentSource sSource = new studentSource  
            {  
                Sname = "崔晓光",  
                age = 23,  
                sex = "男"  
            };  
            //进行转换  ,得到目标实体(DTO)
            var sPurpost = Mapper.Map<studentPurpost>(sSource);  
            Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age);  //输出目标实体的属性
        }  
    }  
</span>}</span> 

         这里还可以用ForMember,一个个的将实体属性对应,不过感觉这样比较麻烦所以就不写了


     小编寄语:通过本次讲述,我们知道了AutoMapper是实体转换模型,他可以将两个相同或者不相同的实体进行相互转化,还可以转化两个实体集,当然AutoMapper的功能远不止这些,它更多的功能还需要我们进一步了解。其实我们在实际工作中没必要非用AutoMapper来转化,只是我们用了之后事情会变的很简单,所以我们不仅要完成任务,更要提高完成任务的效率,这就要求我们多听多看,博览群书,见多识广,这样才能够充分的利用已有的知识,提高我们的生活质量。




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。