Autofac for AutoMapper
我一直在做的事情。NET 开发已经有一段时间了。有时人们问我,为什么我仍然觉得它有趣。答案很简单: 我是超级 d.r.y。如果你不熟悉这个术语,你应该查一下,但它基本上意味着你应该总是尝试应用那些可以,或者更好的,已经被重复使用的解决方案。不要重复自己的话。
一个好的实践是用已经存在的框架自动化所有可能的事情。解析由于使用依赖注入而产生的对象图是一个应该自动化的常见任务。我的选择是AutoMapper 。NET 框架开发。当然。基于 NET 核心的框架有他们自己的:)
在 web 应用程序中经常出现的另一个常见问题是将视图模型或 dto 转换为域对象,反之亦然。同样,为了尽可能地自动化这个过程,我通常使用 AutoMapper。
问题是AutoMapper 和Autofac配合不好。Autofac 项目在 Github 上非常活跃,它们支持很多不同的框架,但是不支持 AutoMapper。虽然 AutoMapper 也支持许多不同的框架,甚至 ASP.NET Core MVC 的 DI 框架,但是它对于普通的旧 ASP.NET MVC 或 Web API 2没有任何支持。这真是太可惜了:)
所以看了下 Automapper ASP.NET Core MVC 集成的源代码,以获得灵感。这种配置添加了 AutoMapper 及其服务,因此您可以轻松地将 IMapper 注入到您的控制器中。注册名单如下:
- As a singleton for the MapperConfiguration
- As a transient instance for IMapper
- ITypeConverter instances as transient
- IValueConverter instances as transient IValueConverter
- IValueResolver instances as transient
- IMemberValueResolver instances as transient IMemberValueResolver
- IMappingAction instances as transient
我猜有很多原因可以解释为什么这些是不同服务的注册,所以我决定为 Autofac 也实现一些类似的东西。我基本上创建了一个新的 Autofac 模块,复制了代码,删除了一些我认为不必要的东西,稍微修改了一下,使用了 Autofac 方法,就这样:
public class AutoMapperModule : Autofac.Module
{
private readonly IEnumerable<Assembly> assembliesToScan;
public AutoMapperModule(IEnumerable<Assembly> assembliesToScan)
{
this.assembliesToScan = assembliesToScan;
}
public AutoMapperModule(params Assembly[] assembliesToScan) : this((IEnumerable<Assembly>)assembliesToScan) { }
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
var assembliesToScan = this.assembliesToScan as Assembly[] ?? this.assembliesToScan.ToArray();
var allTypes = assembliesToScan
.Where(a => !a.IsDynamic && a.GetName().Name != nameof(AutoMapper))
.Distinct() // avoid AutoMapper.DuplicateTypeMapConfigurationException
.SelectMany(a => a.DefinedTypes)
.ToArray();
var openTypes = new[] {
typeof(IValueResolver<,,>),
typeof(IMemberValueResolver<,,,>),
typeof(ITypeConverter<,>),
typeof(IValueConverter<,>),
typeof(IMappingAction<,>)
};
foreach (var type in openTypes.SelectMany(openType =>
allTypes.Where(t => t.IsClass && !t.IsAbstract && ImplementsGenericInterface(t.AsType(), openType))))
{
builder.RegisterType(type.AsType()).InstancePerDependency();
}
builder.Register<IConfigurationProvider>(ctx => new MapperConfiguration(cfg => cfg.AddMaps(assembliesToScan))).SingleInstance();
builder.Register<IMapper>(ctx => new Mapper(ctx.Resolve<IConfigurationProvider>(), ctx.Resolve)).InstancePerDependency();
}
private static bool ImplementsGenericInterface(Type type, Type interfaceType)
=> IsGenericType(type, interfaceType) || type.GetTypeInfo().ImplementedInterfaces.Any(@interface => IsGenericType(@interface, interfaceType));
private static bool IsGenericType(Type type, Type genericType)
=> type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == genericType;
}
现在,您可以简单地将这个模块添加到 Autofac ContainerBuilder 中。对于 ASP.NET Web API,如果您在 Web API 项目中定义映射配置文件,则可以将 typeof (Startup)传递给模块 constuctor (而且由于 dto 只用于与客户机通信,那么它们还能在哪里呢?)然后可以使用构造函数注入来获得 IMapper 实例。
后记
本人不是大佬,只是道路先行者,在落河后,向后来的人大喊一声,这里有坑,不要过来啊!
纵然如此,依旧有人重复着落河,重复着呐喊······
个人博客网站 Blog
技术交流Q群: 1012481075 群内有各种流行书籍资料
文章后续会在公众号更新,微信搜索 OneByOneDotNet 即可关注。
你的一分鼓励,我的十分动力,点赞免费,感恩回馈。喜欢就点赞评论吧,双击6666~
Autofac for AutoMapper的更多相关文章
- 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...
- 使用.Net Core Mvc +SqlSugar +Autofac+AutoMapper+....
开源地址:https://github.com/AjuPrince/Aju.Carefree 目前用到了 SqlSugar.Dapper.Autofac.AutoMapper.Swagger.Redi ...
- AutoMapper 10.0使用教程
这里有个目录 什么是AutoMapper 配置 使用MapperConfiguration配置 使用Profile Instances配置 Naming Conventions(命名约定) Repla ...
- SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...
- 专业上的常用的工具和类库集 By 老衣
Visual Studio 2013 扩展 CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度.提高代码质量. C ...
- Dapper
前一段做一个技术分享关于dapper的,现在再总结一下,也好长时间没有更新博客了--,用到的东西 Dapper.AutoFac .AutoMapper.FluentValidation: 下面说一下D ...
- Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...
- C# 常用工具合集
Visual Studio 2013 扩展 Visual Studio 2013 Update 4:是目前微软发布的最新版开发工具升级包,高效而且强大.下面的扩展都是该版本的Visual Studio ...
- DDD领域驱动之干活(四)补充篇!
距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...
随机推荐
- postgresql 函数集合
1.空间对象字段不建议手动创建,建议使用语句生成空间对象字段,table_name:表名,column_name:生成的列名,3857:坐标系 SELECT AddGeometryColumn ('p ...
- h5问题总结
一.下拉刷新上拉加载 主要依赖一款插件mescroll.js http://www.mescroll.com/ 简单好用.以前同事的用法是初始化执行执行上拉会调,页数从0开始,下拉重新加载当前地址走 ...
- [LeetCode]92. Reverse Linked List II反转部分链表
/* 重点还是反转链表 思路就是中间的反转,然后两头接上 */ public ListNode reverseBetween(ListNode head, int m, int n) { if (he ...
- 【目标检测】基于传统算法的目标检测方法总结概述 Viola-Jones | HOG+SVM | DPM | NMS
"目标检测"是当前计算机视觉和机器学习领域的研究热点.从Viola-Jones Detector.DPM等冷兵器时代的智慧到当今RCNN.YOLO等深度学习土壤孕育下的GPU暴力美 ...
- Arduino IDE 开发 ESP-01S/ESP-01物联网实战检测温度湿度上传MQTT服务器
一.硬件准备 USB转ESP8266两块.DHT11温度湿度传感器.ESP8266-01/ESP8266-01一块(如果学习的话多买几块,ESP-01/ESP-01S的区别) USB转ESP8266 ...
- 使用mybatis执行对应的SQL Mapper配置中的insert、update、delete等标签操作,数据库记录不变
我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方 ...
- INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 的使用和区别
INNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 FULL JOIN ...
- 如何使用容器镜像服务 TCR 轻松实现容器 DevOps
作者周明,腾讯云容器产品工程师.目前主要负责腾讯云TKE.TCR等产品控制台的相关研发工作. 概述 当你使用云厂商提供的容器服务部署业务服务后,是否对交付部署全链路的效率有更高的需求,例如实现基于容器 ...
- CVE-2021-3019 漏洞细节纰漏
CVE编号 CVE-2021-3019 lanproxy任意文件读取 该漏洞是2021年比较新的漏洞 是否需要认证:否 是否执行远程代码:否 是否执行远程命令:否 数据读取是否内网:否 漏洞软件介绍 ...
- 【详细】Python基础(一)
@ 目录 前言 1. Python环境的搭建 1.1 python解释器的安装 1.2 pycharm的安装 2. Python基础语法 2.1 基本语法 2.2 数据类型 2.3 标识符与关键字 2 ...