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 ...
随机推荐
- 从0开始快速入门学Java----基本篇
由于是0基础入门java,所以花了比较多的时间学习了基本语法知识,阶段性梳理下知识: 1. Java的介绍+JDK安装及环境变量配置+第一个程序HelloWorld的编写 这部分开始遇到的问题比较多, ...
- java中将从数据库查询的信息输出到excel文件中
package com.cn.peitest.excel; import java.io.File; import java.lang.reflect.Field; import java.util. ...
- 用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
*无法联网的明显表现会有: 1.yum install出现 Error: cannot find a valid baseurl or repo:base 2.ping host会提示unknown ...
- [leetcode]79.Search Word 回溯法
/** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...
- JDK,JRE,JVM三者之间的关系和作用
1,定义: JDK: Java Develpment Kit java 开发工具 bin:最主要的是编译器(javac.exe) include:java和JVM交互用的头文件 lib:类库 JRE: ...
- 学习 Gin 总结(2020.12.30-31)
2020.12.30 问题总结 中间件 context.Next() 源码注释: // Next should be used only inside middleware. // It execut ...
- 【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中
问题描述 基于.NET Core的Function App如果配置了Application Insights之后,每有一个函数被执行,则在Application Insights中的Logs中的tra ...
- 中移动ipv6-老毛子固件获取ipv6设置
对于有ipv6的服务商原理上可以参照下图
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ 工作队列和交换机)--学习笔记
2.6.4 RabbitMQ -- 工作队列和交换机 WorkQueue Publish/Subscribe Routing EmitLog WorkQueue WorkQueue:https://w ...
- 在Docker下进行MyCAT管理双主双从MySQL集群
前言 在Docker下双主双从MySQL集群模拟 https://www.cnblogs.com/yumq/p/14259964.html 本文实验配置文件 Docker拉取MyCAT镜像 如果没启动 ...