博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让AutoMapper更好用
阅读量:5988 次
发布时间:2019-06-20

本文共 3377 字,大约阅读时间需要 11 分钟。

AutoMapper

Dto与EF实体之间的转换用AutoMapper会变的很方便、很高效,是大多数项目的选择。博主本人的项目也在使用AutoMapper这个组件

好用归好用,但是想要把它用好又是另一事了。AutoMapper需我们去配置映射才可以去进行Map转换,下面有Person类与对应的Dto类

public class Person    {        public string Name { get; set; }        public string Age { get; set; }    }    public class PersonDto    {        public string Name { get; set; }        public string Age { get; set; }    }

按照官方使用方式,我们需要以下几个步骤

//配置映射            Mapper.Initialize(o =>            {                o.CreateMap
(); o.CreateMap
(); }); var p = new Person { Age = "20", Name = "小明" }; //进行转换 var pDto = Mapper.Map
(p);

当然,上面的使用方式没有什么问题,似乎也很简单。但是对于一个项目来说几十成百的表已经是家常便饭,对于种配置方式会不会很蛋疼呢。想象一些一堆的CreateMap就会让人恶心,我也看到现在有一些解决方案,即对映射进行粒化每一个相关的功能或实体创建Profile类,添加到Profile集合中。在程序运行时统一注册。这样也不错,但是还是会去写一堆的Profile类和CreateMap。

使用Atturibute进行配置映射

在abp中看到了使用特性的方式进行配置映射,简单的一行代码就可以解决问题,但是似乎在没有使用abp的项目里并不是那么使用这种方式,所以我就借鉴了这种方法写了一个属于自己的特性

[AutoMapFrom(typeof(Person))]

首先是创建一个类去继承自Attribute,这是很简单的。在实际项目中不一定都是一个实体对应一个dto的情况,还会有一个实体对应多个dto的情况存在,所以toSource应该是一个数组

public class AutoMapAttribute : Attribute    {        public Type[] ToSource { get; private set; }        public AutoMapAttribute(params Type[] toSource)        {            this.ToSource = toSource;        }    }

后面的代码就更为简单了,我们拿到DTO的程序集,(视项目程序集名而定) ,然后拿到所有的自定义类型判断其中的type是否有贴上了AutoMapAttribute类,如果有的话,创建它的实例,拿到source,然后进行创建映射。很简单对吧。

public class AutoMapperModule    {        public static void Init()        {            //拿到dto程序集            var asm = Assembly.Load("DTO");            //拿到自定义的类型            var types = asm.GetExportedTypes();            //创建映射            Mapper.Initialize(o =>            {                foreach (var type in types)                {                    //判断是否贴上了AutoMapAttribute                    if (!type.IsDefined(typeof(AutoMapAttribute))) continue;                    var autoMapper = type.GetCustomAttribute
(); foreach (var source in autoMapper.ToSource) { o.CreateMap(type, source); o.CreateMap(source, type); } } }); } }

最后我们需要在程序启动时去加载这些配置,一切就大功告成了。

protected void Application_Start()        {            //初始化AutoMapper            AutoMapperModule.Init();        }

 

Map的转换

官网提供的方式是使用Mapper.Map的方式进行转换,假如有一天出现一个更吊,速度更快的开源组件。这个时候我们的项目已经和AutoMapper产生了严重的依赖导致替换会变的很吃力,而且Mapper.Map这种方式也并不是那么的简洁好用。所以写一个Map是势在必行的

我想要的是方式是在对象上直接点出Map并且使用泛型选择我要转换后的类型,这时候已经想到可以用扩展方法了,是不是很方便呢

public static class AutoMapExtension {        public static TDestination MapTo
(this object source) { return Mapper.Map
(source); } public static TDestination MapTo
(this TSource source, TDestination destination) { return Mapper.Map(source, destination); }}

 

static void Main(string[] args)        {            //配置映射            Mapper.Initialize(o =>            {                o.CreateMap
(); o.CreateMap
(); }); var p = new Person { Age = "20", Name = "小明" }; //进行转换 p.MapTo
(); }

转载于:https://www.cnblogs.com/LiangSW/p/AutoMapper.html

你可能感兴趣的文章
日期计算器
查看>>
太极LOGO
查看>>
计算机基础以及python第一个脚本
查看>>
juery实现复选框checkbox全选或者不选
查看>>
df命令、du命令以及磁盘分区
查看>>
think X230i WIN8改win7 无法引导的问题解决
查看>>
tomcat服务器基本配置应用
查看>>
iptables 祥解
查看>>
bootstrap-table实现表格可编辑出现的问题
查看>>
impala集成sentry
查看>>
四十九、Nginx防盗链、Nginx访问控制、Nginx解析PHP相关配置、Nginx代理
查看>>
ETL工具kettle的几个小插件(字符串替换,字段选择,将字段值设置为常量)
查看>>
【centos7】格式化磁盘
查看>>
bootstrapTable
查看>>
改名啦!华为认证体系升级通知 !
查看>>
企业在什么样的情况下,需要考虑使用3D打印机
查看>>
Effective C++学习笔记(Part Four:Item 18-25)
查看>>
记一次DDg挖矿gongji
查看>>
中国企业推行精益管理的意义及注意事项
查看>>
搞定操作系统面试,看这篇就够了
查看>>