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>();//}
转载于:https://www.cnblogs.com/NCoreCoder/p/11359294.html
AutoMapper 9.0的改造相关推荐
- AutoMapper 9.0的改造(续)
上一篇有一个读者,有疑问,如何自动化注册Dto 我开篇,做了一个自动化注册的 public sealed class AutoInjectAttribute : Attribute{public Ty ...
- AutoMapper 8.0的应用--动态配置
AutoMapper 8.0中,需要使用configure来配置mapper.为此,实现动态的类型配置如下 public static class AutoMapHelper { ...
- AutoMapper 9.0的使用
AutoMapper于2019.8.12升级9.0 从此不再支持静态的对象转换 自己琢磨了一下,写了一套扩展 官方链接如下 https://github.com/AutoMapper/AutoMapp ...
- mercurymw305r虚拟服务器,Mercury MW305R v3.0 路由器改造 LEDE(OpenWRT)
說明 1. 改造 Mercury MW305R v3.0(芯片 9533) 2. OpenWRT 版本:LEDE 17 3. 環境:Ubuntu 16.04 x64 第一步:修改硬件 1. 換 RAN ...
- Mercury MW305R v3.0 路由器改造 LEDE(OpenWRT)
说明 1. 改造 Mercury MW305R v3.0(芯片 9533) 2. OpenWRT 版本:LEDE 17 3. 环境:Ubuntu 16.04 x64 第一步:修改硬件 1. 换 RAN ...
- Micro Framework 3 0模拟器改造
Micro Framework 3.0的SDK去年十月份就已经发布了,本打算在该SDK发布之后就把我以前开发的,可支持GPIO.I2C.SPI测试的模拟器同步升级为3.0版,以便早点支持VS2008( ...
- yii mysql 查询 类型转换_Yii2.0 API改造(返回数据库对应字段数据类型)
namespace common\ext;useYii;useyii\base\InvalidConfigException;useyii\base\NotSupportedException;use ...
- 如何 0 改造,让单体/微服务应用成为 Serverless Application
作者 | 陈涛(毕衫) 来源|阿里巴巴云原生公众号 一.天然云原生的 Serverless 1. 云原生时代 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K8s 的发展 ...
- 0 改造,让单体/微服务应用成为 Serverless Application
作者 | 陈涛(毕衫) 责编 | 寇雪芹 头图 | 下载于视觉中国 天然云原生的 Serverless 1. 云原生时代 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K ...
最新文章
- JS怎么刷新当前页面
- 将近一半的用户希望能够在两秒内或者更短的时间内打开网站
- centos7双网卡,一个连公网,一个连内网
- 自定义Chrome插件Vimium
- 1284:摘花生《信息学奥赛一本通》
- 基于JAVA+Swing+MYSQL的水果超市管理系统
- php读取excel写入数据库,PHP读取EXCEL文件写入数据库
- 测试远程服务器udp端口,udp端口怎么测试 - 全文
- 嵌入式高速串行并行技术_推荐(张锋)
- PAT 1013 数素数
- 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
- 泡泡龙游戏的完整制作流程
- 学驾照,科目一计分题
- 真实的上海IT圈:张江男vs漕河泾男
- RFID到底是什么技术
- 如何替换 JavaScript 中所有出现的字符串
- 推荐算法实践-章节三-推荐系统冷启动问题-阅读总结
- “格式化”到底是啥意思?
- 为什么那么多人想开发一元夺宝类app?
- 浓缩德国奎尔鱼油 (QÜELL FISH OIL™ HIGHT EPA / DHA / D)
热门文章
- C++从0到1的入门级教学(十二)——运算符重载
- Linux进程状态解析之R、S、D、T、Z
- INI文件读写--VC6.0
- [react] 如何更新组件的状态?
- Taro+react开发(7)--控制跳转
- 前端学习(3153):react-hello-react之脚手架文件介绍
- [html] 如何扩大CheckBox点击区域
- [html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写?
- [css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些?
- 前端学习(2763):基本的数据绑定