[转载]AutoMapper 9.0的改造
时间:2019-11-29
本文章向大家介绍[转载]AutoMapper 9.0的改造,主要包括[转载]AutoMapper 9.0的改造使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
转载自
https://www.cnblogs.com/NCoreCoder/p/11359294.html
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>(); //}
原文地址:https://www.cnblogs.com/hx215267863/p/11957728.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于 HTTP Header 传输签名参数
- 【原创】Java并发编程系列32 | 阻塞队列(下)
- 深入理解swap交换分区理解及扩存
- client-go 之 Reflector 源码分析
- Vue.js点击按钮弹出隐藏菜单的几种方式
- 【Vue.js】Vue.js组件库Element中的单选框、多选框、输入框和计数器
- 【Vue.js】Vue.js组件库Element的基础用法
- 常见的图像处理技术
- docker浅入深出续
- 【21期】你能说说Java中Comparable和Comparator的区别吗
- 昨天晚上熬夜整理的Java注解相关学习笔记
- 对图标的坐标轴进行调整
- Vue 开发技巧总结
- 35.opengl PBR-光照
- 聊聊claudb的list command