什么是AutoMapper?
AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来为我们做?

我们来看看在.netcore3.1中怎样使用AutoMapper9.0。

 public class BasicProfile : Profile, IProfile
{
public BasicProfile()
{
CreateMap<TestDto, Test>();
CreateMap<Test, TestDto>();
}
}

Profile提供了一个命名的映射类,所有继承自Profile类的子类都是一个映射集合。这里我创建了一个BasicProfile继承Profile类。
CreateMap创建映射规则。
IProfile创建影射类的约束,表示继承自该接口的类为映射集合。

由于AutoMapper9.0中取消了自动创建影射规则的方法这里我们需要自己写一个:

 public static class ServiceCollectionExtensions
{
/// <summary>
/// 自动创建映射
/// </summary>
/// <param name="services"></param>
public static void AddAutoMapper(this IServiceCollection services)
{
var allProfile = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll").Select(Assembly.LoadFrom)
.SelectMany(y => y.DefinedTypes)
.Where(p => p.GetInterfaces().Contains(typeof(IProfile)))
.ToArray();
services.AddAutoMapper(allProfile);
}
}

添加到ConfigureServices:

 public void ConfigureServices(IServiceCollection services)
{
//自动创建映射
services.AddAutoMapper();
}

这样AutoMapper就配置完成,但为了方便调用,我们继续写几个扩展:

 public static class AutoMapperApplicationBuilderExtensions
{
private static IServiceProvider _serviceProvider;
public static void UseStateAutoMapper(this IApplicationBuilder applicationBuilder)
{
_serviceProvider = applicationBuilder.ApplicationServices;
} public static TDestination Map<TDestination>(object source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>();
return mapper.Map<TDestination>(source);
} public static TDestination Map<TSource, TDestination>(TSource source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>(); return mapper.Map<TSource, TDestination>(source);
} public static TDestination MapTo<TSource, TDestination>(this TSource source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>();
return mapper.Map<TSource, TDestination>(source);
} public static TDestination MapTo<TDestination>(this object source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>();
return mapper.Map<TDestination>(source);
} public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>();
return mapper.Map<List<TDestination>>(source);
} public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
{
var mapper = _serviceProvider.GetRequiredService<IMapper>();
return mapper.Map<List<TDestination>>(source);
}
}

添加到Configure:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStateAutoMapper();
}

使用:

 public TestDto Get(string id)
{
var test = _testDomain.Get(id);
return test.MapTo<TestDto>();
}

源码地址:https://github.com/letnet/NetCoreDemo

.NetCore学习笔记:四、AutoMapper对象映射的更多相关文章

  1. 初探swift语言的学习笔记四(类对象,函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  2. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  3. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  4. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  5. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  7. JPA学习笔记(8)——映射一对多关联关系

    一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...

  8. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  9. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  10. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

随机推荐

  1. Lobooi 结对作业(24235+24229)

    结队作业 GitHub项目地址 https://github.com/Lobooi/PairProgramming.git 伙伴博客地址 https://www.cnblogs.com/lanti/p ...

  2. Day6-Python3基础-面向对象编程

    面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...

  3. python3.6的安装及cx_oracle安装

    一.创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/by ...

  4. postman发送请求的简单操作

    发送请求常用的是post和get 两者的区别是: 1.post比get安全,因为参数直接暴露在url中,不能用来传递敏感信息 2.get参数通过url传递,post放在request body中 3. ...

  5. abp vnext2.0之核心组件模块加载系统源码解析与简单应用

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  6. docker基础及命令

    1.启动docker sudo systemctl start docker sudo systemctl restart docker sudo systemctl stop docker sudo ...

  7. Tomcat项目启动常见错误以及原因,持续更新.........

    一 Context initialization failed 错误截图: 原因: jdk版本与项目不对应,可重新设置项目jdk和ide编译的jdk即可

  8. DWZ框架--页面样式丢失

    案例 今天我导入DWZ框架demo时,发现主页面样式丢失,出现了如下图那鬼样: 正常情况应该是有表格显示,并且用chrome开发者模式调试,可以看到有对应的样式,如下图所示: 先简单介绍下dwz框架的 ...

  9. 解决docker容器无网络、无法连接互联网----长期更新

    众所周知,docker有三种默认的网络模式,分别是: bridge host none 然后需要注意的就是内核转发这个,一定不要忘了!配置方法如下 echo -e "net.ipv4.ip_ ...

  10. python中os模块的一些小总结

    (一)os模块的应用小总结 os.name: 获取当前系统平台,Windows下返回'nt',Linux下返回'posix'.   os.linesep: 获取当前平台使用的行终止符.Windows下 ...