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 = , 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 == )
{
throw new ArgumentException("泛型类型参数不能为空");
}
return genericArgumentsTypes[];
} /// <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

Asp.Net AutoMapper用法的更多相关文章

  1. AutoMapper用法一瞥

    前段时候做个小项目用到了autoMapper(参考了NOP里的用法),感觉还行,用起来挺方便的.首先复杂的东西我就不说了,至于详细的教程我也就不写了,比较园子里有很多这样的文章,我就分享下,在项目中实 ...

  2. AutoMapper用法(转载)

    申明 本文转载自http://www.qeefee.com/article/automapper 作者:齐飞 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我 ...

  3. Asp.Net多线程用法1

    Asp.Net多线程简单用法 一个web页面 default.aspx 里面有两个控件GridView1,GridView2,通过两个线程分别加载绑定数据. protected void Page_L ...

  4. AutoMapper用法 转载https://www.cnblogs.com/youring2/p/automapper.html

    AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前 ...

  5. asp.net Routing 用法

    http://www.cnblogs.com/youring2/archive/2011/07/22/2113595.html asp.net 4.0中提供了Routing 的支持.通过使用routi ...

  6. ASP.Net Controls 用法大全

    The FindControl method of the System.Web.UI.Control class appears simple enough to use. In fact, the ...

  7. 2017年12月16日 ASP.NET基本用法

    ASP.NET初级添加 利用css代码跟ASP.NET还有Javascript原生,LinQ来写增跟展示数据 首先介绍一个非常好用的控件,灵活并且循环展示数据库里面的数据 <asp:Repeat ...

  8. AutoMapper用法

    可在每层这样写一个类,整合每个实体类的映射 public class AutoMapperHelper { public static void Register() { Mapper.Initial ...

  9. ASP.NET--Razor-model-compare属性用法

    学习使用model中的compare属性来判断两个密码之间是否相同 [Required] [StringLength(100, ErrorMessage = "The {0} must be ...

随机推荐

  1. sleep() 和 wait() 有什么区别?

     sleep:Thread类中定义的方法,表示线程休眠,会自动唤醒: wait:Object中定义的方法,需要手工调用notify()或者notifyAll()方法. sleep是线程类(Thread ...

  2. go协程使用陷阱(转)

    协程中使用全局变量.局部变量.指针.map.切片等作为参数时需要注意,此变量的值变化问题. 与for 循环,搭配使用更需谨慎. 1,内置函数时直接使用局部变量,未进行参数传递 package main ...

  3. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  4. AGC 018E.Sightseeing Plan(组合 DP)

    题目链接 \(Description\) 给定三个不相交的矩形\(A(X1,Y1)-(X2,Y2),B(X3,Y3)-(X4,Y4),C(X5,Y5)-(X6,Y6)\),求 从第一个矩形中某点\(a ...

  5. 1013 ACM 杭电 root

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1013 题意:求两个数的根 如: 12->3,99->9,80->8 注意题目没有限制数的 ...

  6. Prism中命令可用性无法自动刷新

    http://stackoverflow.com/questions/2444927/wpf-prism-canexecute-method-not-being-called It is most l ...

  7. 我的git笔记

    转眼间加入git的阵营已经快两年了,结识git,缘起github,2年前在寻找代码托管网站,当时还是用svn,起初使用google code,可是google的服务虽好,在天朝你懂得,后来发现了git ...

  8. Wed 基础

    HTTP协议 www服务应用的默认端口为80 https加密服务的默认端口为443 常见状态码及其对应的作用 http://oldboy.blog.51cto.com/2561410/716294 2 ...

  9. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) C. Bear and Different Names 贪心

    C. Bear and Different Names 题目连接: http://codeforces.com/contest/791/problem/C Description In the arm ...

  10. linux tail命令的使用方法详解

    本文介绍Linux下tail命令的使用方法. linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更 ...