• 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

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/webapi/p/10470415.html
Copyright © 2020-2023  润新知