.net使用automapper的详细教程
author:一佰互联 2019-03-28   click:224

简介:安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可。先说说DTODTO是个什么东东?DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。 ...

安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可。先说说DTODTO是个什么东东?DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。为什么要用DTO?1、DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层2、DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Model之间的解耦,因此改动领域Model不会影响UI层3、DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用我从网上找了一些资料,AutoMapper现在我们既然知道了使用DTO的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现DTO和领域Model之间的转换?有两个思路,我们要么自己写转换代码,要么使用工具。不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。其实这样的转换工具很多,不过我还是决定使用AutoMapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。使用AutoMapper可以很方便的实现DTO和领域Model之间的转换,它是一个强大的Object-Object Mapping工具。下载了个demo,然后自己又写了一遍,我把AutoMapper 的使用分为两种:1、viewmodel与实体的字段名字是一致的,viewmodel的字段可以比实体中的字段少,但是不能多。还有一种情况是:源实体中的字段名字是Getxxx,那么viewmodel中对应的字段可以是xxx,也会自动对应赋值,比如我写的demo中源实体中GetA,viewmodel中的A;再有一种情况就是实体中的实体赋值,在我写的这个例子中,源实体中包含的实体类字段为Sub,里面包含的字段名字为Age,那么destmodel中对应的字段名字可以是:SubAge,那么automapper就可以自动为你赋值了,大家看最后的运行结果。给大家看下我建的源实体:publicclass Source1{publicstring Name { set; get; }publicstring GetA { set; get; }publicstring GetD { set; get; }publicstring SetB { set; get; }publicstring c { set; get; }public SubSource1 Sub { set; get; }}publicclass SubSource1{publicstring Age { set; get; }}还有viewmodel(要转化成为你想要的模型):publicclass Dest1{publicstring Name { set; get; }publicstring A { set; get; }publicstring C { set; get; }publicstring SubAge { set; get; }publicstring D { set; get; }}我封装的扩展方法:/// <summary>/// 类型映射,默认字段名字一一对应/// </summary>/// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>/// <typeparam name="TSource">要被转化的实体,Entity</typeparam>/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>/// <returns>转化之后的实体</returns>publicstatic TDestination MapTo<TDestination, TSource>(this TSource source) where TDestination:class where TSource :class{if (source == null) returndefault(TDestination); var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>()); var mapper = config.CreateMapper();return mapper.Map<TDestination>(source);}使用方式:var source1 = new Source1{ Name = "source", Sub = new SubSource1 { Age = "25" }, c = "c", GetA = "A", SetB = "B"};var destViewModel = source1.MapTo<Dest1, Source1>();运行结果:

.net使用automapper的详细教程

2.viewmodel与实体字段名字没有全部对应,只有几个字段的名字和源实体中的字段名字是一样的,其他的字段是通过实体中的几个字段组合或者是格式或者是类型转化而来的,使用方法:不能再使用这个扩展方法了,只能自己额外写代码,代码如下:var config2 = new MapperConfiguration( cfg => cfg.CreateMap<SourceUser, DestUser2>() .ForMember(d => d.DestName, opt => opt.MapFrom(s => s.Name)) //指定字段一一对应 .ForMember(d => d.Birthday, opt => opt.MapFrom(src => src.Birthday.ToString("yy-MM-dd HH:mm")))//指定字段,并转化指定的格式 .ForMember(d => d.Age, opt => opt.Condition(src => src.Age > 5))//条件赋值 .ForMember(d => d.A1, opt => opt.Ignore())//忽略该字段,不给该字段赋值 .ForMember(d => d.A1, opt => opt.NullSubstitute("Default Value"))//如果源字段值为空,则赋值为 Default Value .ForMember(d => d.A1, opt => opt.MapFrom(src => src.Name + src.Age * 3 + src.Birthday.ToString("d"))));//可以自己随意组合赋值var mapper2 = config2.CreateMapper();注释中都包含了平时常用的几种情况,其他的我就没有再写。下面再给大家把list转化的扩展方法代码贴上:/// <summary>/// 集合列表类型映射,默认字段名字一一对应/// </summary>/// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>/// <typeparam name="TSource">要被转化的实体,Entity</typeparam>/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>/// <returns>转化之后的实体列表</returns>publicstatic IEnumerable<TDestination> MapToList<TDestination, TSource>(this IEnumerable<TSource> source) where TDestination : class where TSource : class{if (source == null) returnnew List<TDestination>(); var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>()); var mapper = config.CreateMapper();return mapper.Map<List<TDestination>>(source);}同样的使用方式: var source1 = new Source1 { Name = "source", Sub = new SubSource1 { Age = "25" }, c = "c", GetA = "A", SetB = "B" };var source3 = new Source1 { Name = "source3", Sub = new SubSource1 { Age = "253" }, c = "c3", GetA = "A3", SetB = "B3" }; var sourceList = new List<Source1> { source1, source3 }; var destViewModelList = sourceList.MapToList<Dest1, Source1>();运行结果:

.net使用automapper的详细教程

本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.yinxi.net学习互联网营销技术请到巅云建站www.yx10011.com。