在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一:介绍AutoMapper的功能就是实现映射一个对象到另一个对象的自动化工具,最常见的就是DTO (Data Transfer Object)与MO(ModelObject)之间的转换。 现在有两个类,实体类Blogs和BlogsView之间的转化 [Table("Blog")] public class Blog: BaseEntity { [Key] public int Id { get; set; } public string Title { get; set; } public string Link { get; set; } public DateTime? Date { get; set; } public string Author { get; set; } public string Tag { get; set; } } public class BlogView { public int Id { get; set; } public string TitleName { get; set; } public string Link { get; set; } public DateTime? Date { get; set; } public string Author { get; set; } public string Tag { get; set; } } 二:使用(1) 安装AutoMapper右键项目打开NuGet程序管理包,安装AutoMapper和AutoMapper.Extensions.Microsoft.DependencyInjection AutoMapper.Extensions.Microsoft.DependencyInjection,这个是用来配合依赖注入的, 在项目当中,都使用依赖注入,尽量不要用new 来实例化,导致层耦合
(2) 添加映射文件在安装项目中新建Automapper文件夹,然后创建AutomapperConfig.cs文件继承自Profile类,用来配置所有的映射关系。
public class AutomapperConfig : Profile { public AutomapperConfig() { CreateMap<Blog, BlogView>().ForMember(e => e.TitleName, v => v.MapFrom(a => a.Title)); } } 这里的 Profile有什么用呢,是 services.AddAutoMapper他会自动找到所有继承了Profile的类然后进行配置。我这个类是放在Service层的 使用AutoMapper实现模型映射,并注入 那此时Startup类里面的配置就可以写成 services.AddAutoMapper(Assembly.Load("Service"));它会自动加载Service的程序集并从这里面找到继承了profile类的配置实现。 (3) 使用mapper/// <summary> /// 构造函数 /// </summary> /// <param name="blogData"></param> public BlogService(IBlogData blogData, IMapper mapper) { _blogData = blogData; _mapper = mapper; } BlogView model = new BlogView(); _mapper.Map(blog, model); 这时就会把Blog属性值映射到BlogView实体中了 当两个实体类属性不同时可以通过配置的方式进行映射 CreateMap<Blog, BlogView>().ForMember(e => e.TitleName, v => v.MapFrom(a => a.Title)) 当不想对某个属性进行映射我们可以忽略 .ForMember(e => e.Author, v => v.Ignore());
AutoMap帮助类: /// <summary> /// AutoMapper的帮助类 /// </summary> public static class AutoMapperHelper { /// <summary> /// 单条实体类型映射,默认字段名字一一对应 /// </summary> /// <typeparam name="TSource">Dto类型</typeparam> /// <typeparam name="TDestination">要被转化的数据</typeparam> /// <param name="source">转化之后的实体</param> /// <returns></returns> public static TDestination MapTo<TSource, TDestination>(this TSource source) where TDestination : class, new() where TSource : class { if (source == null) return new TDestination(); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); var mapper = config.CreateMapper(); return mapper.Map<TDestination>(source); } /// <summary> /// 实体列表类型映射,默认字段名字一一对应 /// </summary> /// <typeparam name="TDestination">Dto类型</typeparam> /// <typeparam name="TSource">要被转化的数据</typeparam> /// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param> /// <returns>转化之后的实体列表</returns> public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source) where TDestination : class where TSource : class { if (source == null) return new List<TDestination>(); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); var mapper = config.CreateMapper(); return mapper.Map<List<TDestination>>(source); } }
|
请发表评论