我一直在做的事情。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的更多相关文章

  1. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  2. 使用.Net Core Mvc +SqlSugar +Autofac+AutoMapper+....

    开源地址:https://github.com/AjuPrince/Aju.Carefree 目前用到了 SqlSugar.Dapper.Autofac.AutoMapper.Swagger.Redi ...

  3. AutoMapper 10.0使用教程

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

  4. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...

  5. 专业上的常用的工具和类库集 By 老衣

    Visual Studio 2013 扩展 CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度.提高代码质量. C ...

  6. Dapper

    前一段做一个技术分享关于dapper的,现在再总结一下,也好长时间没有更新博客了--,用到的东西 Dapper.AutoFac .AutoMapper.FluentValidation: 下面说一下D ...

  7. Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...

  8. C# 常用工具合集

    Visual Studio 2013 扩展 Visual Studio 2013 Update 4:是目前微软发布的最新版开发工具升级包,高效而且强大.下面的扩展都是该版本的Visual Studio ...

  9. DDD领域驱动之干活(四)补充篇!

    距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...

随机推荐

  1. FaaS,未来的后端服务开发之道

    说 FaaS 先要说说 PaaS 平台即服务(Platform as a Service)是一种云计算服务,提供运算平台与解决方案堆栈即服务.在云计算的典型层级中,平台即服务层介于软件即服务与基础设施 ...

  2. 这4种ThreadLocal你都知道吗?

    什么是ThreadLocal ThreadLocal类顾名思义可以理解为线程本地变量.也就是说如果定义了一个ThreadLocal, 每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会 ...

  3. 【探索之路】机器人篇(2)-ROS系统并创建工作空间和项目

    在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:ht ...

  4. maven版本仲裁原则

    这里有一个案例是项目里依赖了b组件,b组件依赖了a组件1.0.2版本,而用户也直接在pom依赖了a组件并声明的1.0.0版本,结果在仲裁时选择了1.0.0版本的a组件: +- com.xxx:a:ja ...

  5. 线程方法wait()和notify()的使用

    实现需求: 开启2个线程,1个线程对某个int类型成员变量加1,另外1个减1,但是要次序执行,即如果int型的成员变量是0,则输出01010101这样的结果 代码如下 1 package test; ...

  6. PHP设计模式之代理模式

    代理模式定义 为其他对象提供一种代理,以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用. 代理模式使用场景 当需要隐藏一 ...

  7. 关于.NET中的控制反转(二)- 依赖注入之 MEF

    一.MEF是什么 Managed Extensibility Framework (MEF) 是用于创建可扩展的轻量级应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发 ...

  8. Angular入门到精通系列教程(6)- Angular的升级

    1. 摘要 2. https://update.angular.io/ 3. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 Node: 12.18.3 npm ...

  9. ATM_tests

    ATM取款机练习程序 一.程序分析 自顶向下.逐步细化 按照程序执行的流程,将程序分解为若干个功能相对独立的函数(方法),每个函数(方法)负责某一功能,然后根据程序执行的流程,将函数(方法)组装(调用 ...

  10. 免费、开源的基于tp5的快速开发框架

    HisiPHP 系统官网:https://www.hisiphp.com/ 后台体验:http://v2.demo.hisiphp.com/admin.php/system/publics/index ...