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的改造的更多相关文章

  1. AutoMapper 9.0的改造(续)

    上一篇有一个读者,有疑问,如何自动化注册Dto 我开篇,做了一个自动化注册的 public sealed class AutoInjectAttribute : Attribute { public ...

  2. AutoMapper 10.0使用教程

    这里有个目录 什么是AutoMapper 配置 使用MapperConfiguration配置 使用Profile Instances配置 Naming Conventions(命名约定) Repla ...

  3. .net core 3.1 WebAPi 使用 AutoMapper 9.0、10.0

    AutoMapper 可以很方便完成数据对象之间的转换. Dto -> Entity Entity -> ViewModel Step 1:通过 NuGet 安装 AutoMapper 的 ...

  4. VS2012 Nuget 安装 AutoMapper时报错的解决方法

    VS2012 在.net 4.0下安装AutoMapper时,会报以下错误: “AutoMapper”已拥有为“Standard.Library”定义的依赖项. 'AutoMapper' alread ...

  5. 【.NET】AutoMapper学习记录

    在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),AutoMapper就是将一个对象自动转换为另一个对象的技术 背景 一些orm框架,在用到Entity的时候有一些开源代码用到了 ...

  6. 一个比 AutoMapper 更快的模型映射的组件 Mapster

    下面是官方的性能测试 Demo,感性的也可以去 Github 上下载. 贴出代码目的是如果后期直接从自己的博客中在线看. using System; using System.Collections. ...

  7. .Net Core2.2 使用 AutoMapper进行实体转换

    一.遇到的问题 在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换 ...

  8. 【C#】AutoMapper 使用手册

    目录 1 入门例子 2 注册 2.1 Profile 3 配置 3.1 命名约定 3.2 配置可见性 3.3 全局属性/字段过滤 3.4 识别前缀和后缀 3.5 替换字符 4 调用构造函数 5 数组和 ...

  9. 若依3.6.0使用Mybatis-plus分页失效以及完美替换Pagehelper

    一.前言 小编最近在经历后端框架的迁移,虽然不是小编来做,但是有个分页的情况让小编和一个同事去搞. 说一下小编这边的需求: 原来框架使用Mybatis-plus进行分页,要更换的新框架若依是使用Pag ...

随机推荐

  1. IDEA怎么设置类的注释模板和方法注释模板

    文件头注释模板 File | Settings | Editor | File and Code Templates /** * @Author your name * @DateTime ${YEA ...

  2. 521我发誓读完本文,再也不会担心Spring配置类问题了

    当大潮退去,才知道谁在裸泳.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...

  3. Java多线程编程基础知识汇总

    多线程简介 多任务   现代操作系统(Windows.Linux.MacOS)都可以执行多任务,多任务就是同时运行多个任务.例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播 ...

  4. Hadoop基础(二):从Hadoop框架讨论大数据生态

    1 Hadoop是什么 2 Hadoop三大发行版本 Hadoop三大发行版本:Apache.Cloudera.Hortonworks. Apache版本最原始(最基础)的版本,对于入门学习最好. C ...

  5. redis(二十一):Redis 架构模式实现(哨兵)

    先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel ...

  6. 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟

    周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...

  7. 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了

    https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...

  8. 精通java并发-synchronized关键字和锁

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages synchronized关键字和锁 示例代码 public class MyThreadTest2 { public ...

  9. 《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.简介 1. 谁发明了设计模式? 2. 我怎么学不会设计模式? 3. 适 ...

  10. 数据规整:连接、联合与重塑知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...