zoukankan      html  css  js  c++  java
  • ASP.NET Core中使用AutoMapper实现自动转化

    一:介绍

    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);
            }
    
    
    
    
        }
  • 相关阅读:
    es集群状态
    浅谈GO语言中的面向对象
    jstat命令详解
    jvm g1gc回收器
    解决ES集群状态异常教程(存在UNASSIGNED)
    html5分割上传实现超大文件无插件网页上传工具
    html5分割上传实现超大文件无插件网页上传
    科讯使用的:ckeditor编辑器.复制word图片.一直沾不上去.谁有好的解决办法呢
    编辑器直接word直接上传word里的图片
    请问有支持直接从 word 文档复制图片的 editor 吗
  • 原文地址:https://www.cnblogs.com/ZhengHengWU/p/12794455.html
Copyright © 2011-2022 走看看