• Asp.Net AutoMapper用法


    1、AutoMapper简介

    用于两个对象映射,例如把Model的属性值赋值给View Model。传统写法会一个一个属性的映射很麻烦,使用AutoMapper两句代码搞定。

    2、AutoMapper安装

    推荐使用nuget搜索AutoMapper安装

    3、AutoMapper简单用法

    先建个model

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace cms.Web.Models
    {public class book
        {
            public int ID { get; set; }
            public string name { get; set; }
            public string className { get; set; }
        }
    
        public class bookViewModel
        {
            public int ID { get; set; }
            public string name { get; set; }
            public string className { get; set; }
            public int price { get; set; }
            public string des { get; set; }
        }
    }

    controller代码

    public object ceshi()
            {
                book data = new book { ID = 1, name = "少年1号", className = "娱乐" };
    
                //映射初始化写法1
                Mapper.Initialize(x => x.CreateMap<book, bookViewModel>());
    
                ////映射初始化写法2
                //Mapper.Initialize(config =>
                //{
                //    config.CreateMap<book, bookViewModel>();
    
                //});
    
                ////映射初始化写法3
                //var cfg = new MapperConfigurationExpression();
                //cfg.CreateMap<book, bookViewModel>();
                //cfg.CreateMap<bookViewModel, book>();
                //Mapper.Initialize(cfg);
    
                //映射-写法1:由AutoMapper创建目标对象
                var vmodel = Mapper.Map<book, bookViewModel>(data);
    
                //映射 - 写法2:让AutoMapper把源对象中的属性值合并 / 覆盖到目标对象(推荐
                bookViewModel vmodel2 = new bookViewModel();
                Mapper.Map(data, vmodel2);
            Mapper.Reset();//没有这句代码刷新页面会出错
    
                //return vmodel.ToString();
                return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(vmodel2));
            }

    4、AutoMapper扩展类

    https://www.cnblogs.com/jianxuanbing/p/7122877.html

    很多时候我们使用AutoMapper的时候,都需要进行一个配置才可以使用Mapper.Map<Source,Target>(entity);。如果不进行配置则会报错。
    如果实体过多,有时候会忘记是否有配置,只有运行的时候才会发现这个BUG。

    该扩展基于AutoMapper 6.x版本,因此需要从Nuget下载相应的包。
    该扩展对于Object以及List<T>进行了兼容支持,因此MapTo<TSource,TDestination>()可以直接映射实体与泛型列表。

    AutoMapperHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using AutoMapper;
    using System.Globalization;
    namespace cms.Web.App_Code
    {
        public static class AutoMapperHelper
        {
            /// <summary>
            /// 同步锁
            /// </summary>
            private static readonly object Sync = new object();
    
            #region MapTo(将源对象映射到目标对象)
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            /// <typeparam name="TSource">源类型</typeparam>
            /// <typeparam name="TDestination">目标类型</typeparam>
            /// <param name="source">源对象</param>
            /// <param name="destination">目标对象</param>
            /// <returns></returns>
            public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
            {
                return MapTo<TDestination>(source, destination);
            }
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            /// <typeparam name="TDestination">目标类型</typeparam>
            /// <param name="source">源对象</param>
            /// <returns></returns>
            public static TDestination MapTo<TDestination>(this object source) where TDestination : new()
            {
                return MapTo(source, new TDestination());
            }
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            /// <typeparam name="TDestination">目标类型</typeparam>
            /// <param name="source">源对象</param>
            /// <param name="destination">目标对象</param>
            /// <returns></returns>
            private static TDestination MapTo<TDestination>(object source, TDestination destination)
            {
                if (source == null)
                {
                    throw new ArgumentNullException("source is null");
                }
                if (destination == null)
                {
                    throw new ArgumentNullException("destination is null");
                }
                var sourceType = GetType(source);
                var destinationType = GetType(destination);
                var map = GetMap(sourceType, destinationType);
                if (map != null)
                {
                    return Mapper.Map(source, destination);
                }
                lock (Sync)
                {
                    map = GetMap(sourceType, destinationType);
                    if (map != null)
                    {
                        return Mapper.Map(source, destination);
                    }
                    InitMaps(sourceType, destinationType);
                }
                return Mapper.Map(source, destination);
            }
    
            /// <summary>
            /// 获取映射配置
            /// </summary>
            /// <param name="sourceType">源类型</param>
            /// <param name="destinationType">目标类型</param>
            /// <returns></returns>
            private static TypeMap GetMap(Type sourceType, Type destinationType)
            {
                try
                {
                    return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                }
                catch (InvalidOperationException)
                {
                    lock (Sync)
                    {
                        try
                        {
                            return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                        }
                        catch (InvalidOperationException)
                        {
                            InitMaps(sourceType, destinationType);
                        }
                        return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                    }
                }
            }
    
            /// <summary>
            /// 获取类型
            /// </summary>
            /// <param name="obj">对象</param>
            /// <returns></returns>
            private static Type GetType(object obj)
            {
                var type = obj.GetType();
                if (obj is System.Collections.IEnumerable == false)
                {
                    return type;
                }
                if (type.IsArray)
                {
                    return type.GetElementType();
                }
                var genericArgumentsTypes = type.GetTypeInfo().GetGenericArguments();
                if (genericArgumentsTypes == null || genericArgumentsTypes.Length == 0)
                {
                    throw new ArgumentException("泛型类型参数不能为空");
                }
                return genericArgumentsTypes[0];
            }
    
            /// <summary>
            /// 初始化映射配置
            /// </summary>
            /// <param name="sourceType">源类型</param>
            /// <param name="destinationType">目标类型</param>
            private static void InitMaps(Type sourceType, Type destinationType)
            {
                try
                {
                    var maps = Mapper.Configuration.GetAllTypeMaps();
                    Mapper.Initialize(config =>
                    {
                        ClearConfig();
                        foreach (var item in maps)
                        {
                            config.CreateMap(item.SourceType, item.DestinationType);
                        }
                        config.CreateMap(sourceType, destinationType);
                    });
                }
                catch (InvalidOperationException)
                {
                    Mapper.Initialize(config =>
                    {
                        config.CreateMap(sourceType, destinationType);
                    });
                }
            }
    
            /// <summary>
            /// 清空配置
            /// </summary>
            private static void ClearConfig()
            {
                var typeMapper = typeof(Mapper).GetTypeInfo();
                var configuration = typeMapper.GetDeclaredField("_configuration");
                configuration.SetValue(null, null, BindingFlags.Static, null, CultureInfo.CurrentCulture);
            }
    
            #endregion
    
            #region MapToList(将源集合映射到目标列表)
    
            /// <summary>
            /// 将源集合映射到目标列表
            /// </summary>
            /// <typeparam name="TDestination">目标元素类型,范例:Sample,不用加List</typeparam>
            /// <param name="source">源集合</param>
            /// <returns></returns>
            public static List<TDestination> MapToList<TDestination>(this System.Collections.IEnumerable source)
            {
                return MapTo<List<TDestination>>(source);
            }
    
            #endregion
        }
    }

    用法,非常简单

    public object ceshi()
            {
                bookViewModel vmodel2 = new bookViewModel();
    
                AutoMapperHelper.MapTo(data, vmodel2);
    
                return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(vmodel2));
            }
            public object ceshi2()
            {
                dbEntities db = new dbEntities();
                var list = db.news;
                var list2 = AutoMapperHelper.MapToList<news>(list);
                return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(list2));
            }

    5、AutoMapper高级用法

    https://www.cnblogs.com/youring2/p/automapper.html

    http://www.cnblogs.com/1-2-3/p/AutoMapper-Best-Practice.html

  • 相关阅读:
    动态代理:JDK动态代理和CGLIB代理的区别
    spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码
    spring启动component-scan类扫描加载过程---源码分析
    spring源码分析之spring-core asm概述
    Spring组件扫描 <context:component-scan/>
    【OSGI】1.初识OSGI-到底什么是OSGI
    superrvisor application config ini
    doris 0.9.0版本docker镜像制作与使用
    Docker系列09:搭建Harbor本地镜像仓库
    Docker系列08:容器监控
  • 原文地址:https://www.cnblogs.com/webapi/p/10470415.html
Copyright © 2020-2023  润新知