zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/webapi/p/10470415.html
Copyright © 2011-2022 走看看