AutoMapper 9.0的改造
AutoMapper于2019.8.12升级9.0
从此不再支持静态的对象转换
自己琢磨了一下,写了一套扩展
官方链接如下
https://github.com/AutoMapper/AutoMapper/tree/v9.0.0
我做了一下方便使用的简单封装
public static class AutoMapperExtension
{
public static IServiceCollection AddAutoMapper(this IServiceCollection service)
{
service.TryAddSingleton<MapperConfigurationExpression>();
service.TryAddSingleton(serviceProvider =>
{
var mapperConfigurationExpression = serviceProvider.GetRequiredService<MapperConfigurationExpression>();
var instance = new MapperConfiguration(mapperConfigurationExpression); instance.AssertConfigurationIsValid(); return instance;
});
service.TryAddSingleton(serviceProvider =>
{
var mapperConfiguration = serviceProvider.GetRequiredService<MapperConfiguration>(); return mapperConfiguration.CreateMapper();
}); return service;
} public static IMapperConfigurationExpression UseAutoMapper(this IApplicationBuilder applicationBuilder)
{
return applicationBuilder.ApplicationServices.GetRequiredService<MapperConfigurationExpression>();
}
}
调用则是在ConfigureServices方法内增加一行
services.AddAutoMapper();
在Configure方法内增加如下代码
var expression = app.UseAutoMapper();
expression.CreateMap<Foo, FoodDto>();
这样就完成了DI版本的AutoMapper
调用例子代码如下
public class ValuesController : ControllerBase
{
private IMapper Mapper { get; } public ValuesController(IMapper mapper)
{
Mapper = mapper;
} // GET api/values
[HttpGet]
public FoodDto Get()
{
var model = new Foo()
{
Id = Guid.NewGuid(),
Name = "test",
Money = 15.0m
}; return Mapper.Map<FoodDto>(model);
}
}
测试结果如下

但是仅仅是这样不够的,方便使用的话,还需要一个静态Helper
代码如下
public static class AutoMapperHelper
{
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);
}
}
同理在Configure方法内增加一行代码
app.UseStateAutoMapper();
增加一个Action调用一下
[HttpGet("Static")]
public FoodDto Static()
{
var model = new Foo()
{
Id = Guid.NewGuid(),
Name = "test",
Money = 15.0m
};
return AutoMapperHelper.Map<FoodDto>(model);
}
调用结果如下

大功告成,其实这次更新只是一个思路上的转变,便捷性,都只是小事儿而已
应邀在某个汪姓大佬的要求下,增加两个扩展方法
public static class AutoMapperHelper
{
...
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);
}
}
测试例子改为
[HttpGet("Static")]
public FoodDto Static()
{
var model = new Foo()
{
Id = Guid.NewGuid(),
Name = "test",
Money = 15.0m
};
return model.MapTo<FoodDto>();
}
//[HttpGet("Static")]
//public FoodDto Static()
//{
// var model = new Foo()
// {
// Id = Guid.NewGuid(),
// Name = "test",
// Money = 15.0m
// };
// return model.MapTo<Foo, FoodDto>();
//}
AutoMapper 9.0的改造的更多相关文章
- AutoMapper 9.0的改造(续)
上一篇有一个读者,有疑问,如何自动化注册Dto 我开篇,做了一个自动化注册的 public sealed class AutoInjectAttribute : Attribute { public ...
- AutoMapper 10.0使用教程
这里有个目录 什么是AutoMapper 配置 使用MapperConfiguration配置 使用Profile Instances配置 Naming Conventions(命名约定) Repla ...
- .net core 3.1 WebAPi 使用 AutoMapper 9.0、10.0
AutoMapper 可以很方便完成数据对象之间的转换. Dto -> Entity Entity -> ViewModel Step 1:通过 NuGet 安装 AutoMapper 的 ...
- VS2012 Nuget 安装 AutoMapper时报错的解决方法
VS2012 在.net 4.0下安装AutoMapper时,会报以下错误: “AutoMapper”已拥有为“Standard.Library”定义的依赖项. 'AutoMapper' alread ...
- 【.NET】AutoMapper学习记录
在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),AutoMapper就是将一个对象自动转换为另一个对象的技术 背景 一些orm框架,在用到Entity的时候有一些开源代码用到了 ...
- 一个比 AutoMapper 更快的模型映射的组件 Mapster
下面是官方的性能测试 Demo,感性的也可以去 Github 上下载. 贴出代码目的是如果后期直接从自己的博客中在线看. using System; using System.Collections. ...
- .Net Core2.2 使用 AutoMapper进行实体转换
一.遇到的问题 在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换 ...
- 【C#】AutoMapper 使用手册
目录 1 入门例子 2 注册 2.1 Profile 3 配置 3.1 命名约定 3.2 配置可见性 3.3 全局属性/字段过滤 3.4 识别前缀和后缀 3.5 替换字符 4 调用构造函数 5 数组和 ...
- 若依3.6.0使用Mybatis-plus分页失效以及完美替换Pagehelper
一.前言 小编最近在经历后端框架的迁移,虽然不是小编来做,但是有个分页的情况让小编和一个同事去搞. 说一下小编这边的需求: 原来框架使用Mybatis-plus进行分页,要更换的新框架若依是使用Pag ...
随机推荐
- class文件的基本结构及proxy源码分析二
前文地址:https://www.cnblogs.com/tera/p/13267630.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- Scala 面向对象(二):package 包 (一) 入门
1 Scala包的基本介绍 和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项. 2 Scala包快速入门 使 ...
- python 并发专题(十三):asyncio (一) 初识
https://www.cnblogs.com/wongbingming/p/9095243.html . 本文目录# 如何定义/创建协程 asyncio的几个概念 学习协程是如何工作的 await与 ...
- JavaWeb基础(day14_css)
css css样式种类 内部样式 在head标签中使用 <style>标签 行内样式 直接在标签中写style属性进行赋值,style属性的就相当于内部样式的{} 外部样式 单独写一个文件 ...
- 二、Python系列——time时间格式的转换及计算
# -*- coding:utf-8 -*- import pandas as pd import time import datetime start_date = '2020-06-08' # 一 ...
- Python Ethical Hacking - BACKDOORS(1)
REVERSE_BACKDOOR Access file system. Execute system commands. Download files. Upload files. Persiste ...
- 「美团面试系列」面试加分项,这样说你会JVM,面试官还能问什么
Java性能调优都是老生常谈的问题,特别当“糙快猛”的开发模式大行其道时,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 比如,下面这些典型的性能问题,你肯定或多或少都遇到过: 在进行性 ...
- smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法
smartJQueryZoom 是一个很好用的库. 它基于jQuery,可以对某个元素(比如 img)进行渲染,渲染之后可以放大这个区域,在做图片浏览时很好用. 但它有一个兼容性BUG: 当浏览器不是 ...
- linux虚拟机正常安装完成后获取不到IP的解决办法-网卡
通常正常情况下安装完linux虚拟机,只需要使用桥接并修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,将如下参数值改为如下: ONBOOT=yes NM ...
- laravel 数据分页简单示例
控制器代码:只需用paginate($pageSize)方法查询数据即可 $pageSize:每页显示的记录数 public function index() { $data = Member::pa ...