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来转化,只是我们用了之后事情会变的很简单,所以我们不仅要完成任务,更要提高完成任务的效率,这就要求我们多听多看,博览群书,见多识广,这样才能够充分的利用已有的知识,提高我们的生活质量。

时间: 2024-10-11 04:50:40

AutoMapper——Map之实体的桥梁(二)的相关文章

阴影映射(Shadow Map)的研究(二)

阴影映射(Shadow Map)的研究(二) 上一篇文章介绍了我对Z缓存的较为详细的研究.这里之所以对Ze求导函数,是因为的我们需要寻找它的变化曲线,从而找到极值点,这样就能够确定Ze相对于zw的疏密分布情况.幸运的是,我们找到的导函数是双曲函数,并且我们关心的的右侧是单调递增的. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44946763.欢迎同行前来探讨. 引出上一篇文章的结论,当 时,导函数取得最大值.但是在Zw∈

map转实体工具类

package cst.spmBase.util; import java.lang.reflect.InvocationTargetException;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.commons.beanutils.BeanUtils;/** * 将map转换为实体 * @author Administrator * */public class

JAVA中 Map转换实体类对象简单实现 JSON

原文链接:https://blog.csdn.net/qq_23140197/article/details/86503875   (侵删) 开发的过程中往往依赖的表过多直接按Map来传递数值,某些场景需要把Map转换为实体类,这里贴一个最简洁的方法,依赖阿里的FastJSon. maven引入 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId>

AutoMapper的介绍与使用(二)

AutoMapper的匹配 1,智能匹配 AutoMapper能够自动识别和匹配大部分对象属性: 如果源类和目标类的属性名称相同,直接匹配,不区分大小写 目标类型的CustomerName可以匹配源类型的Customer.Name 目标类型的Total可以匹配源类型的GetTotal()方法 2,自定义匹配 Mapper.CreateMap<CalendarEvent, CalendarEventForm>()                                          

java 将map转为实体类

1 public static <T> T map2Object(Map<String, Object> map, Class<T> clazz) { 2 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 4 5 if (map == null) { 6 return null; 7 } 8 T obj = null; 9 try { 10 // 使用newIn

FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() .AsTable((a, b) => "(select * from user where clicks > 10)") .Page(1, 10).ToList(); 本身 AsTable 是用来进行分表分库的,后续我们会接着讲. 友情提醒:当开启了自动同步结构功能,UserX

java 实体对象与Map之间的转换工具类(自己还没看)

java实体对象与Map之间的转换工具类 import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class EntityUtils { /** * 实体类转Map * @param object * @return */ public static Map<String, Object> entityToMap(Object object) { Map<String,

AutoMapper

AutoMapper 使用实践 一.   使用意图 常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况.一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性,单单写这些没有技术含量的赋值语句,就要用很大的代码篇幅.假如做得好一点的话,一般就是利用反射的方式,将A属性赋值给B,当然用反射的话,要顺利将A的属性,赋值B的属性,这样确实能够减少代码篇幅,那就要有一些约束或者限制,例如属性名称要相同,属性的数据类型要相同,这样反

[转] GIS二次开发(C#+AE)

乘风莫邪 原文GIS二次开发(C#+AE) 此过程描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <</FONT>安装目录>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer 注:ArcGIS样例程序不包含在ArcGIS Engine开发工具包“典型”安装方式中