我一直在做的事情。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. 合适么?现在学ASP.NET Core入门编程……

    现在都快找不到ASP.NET的培训课程了. 知道我要开课做培训,有同学劝我:"憋讲那什么.NET,讲Java,现在这个火!"我说我Java不熟,"唉呀!C#转Java,分 ...

  2. 初识ABP vNext(1):开篇计划基础知识

    点击上方蓝字"小黑在哪里"关注我吧 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology ...

  3. 100ms的SQL把服务器搞崩溃了

    前言 一个项目上线了两个月,除了一些反馈的优化和小Bug之外,项目一切顺利:前期是属于推广阶段,可能使用人员没那么多,当然对于项目部署肯定提前想到并发量了,所以早就把集群安排上,而且还在测试环境搞了一 ...

  4. 老衣的开发工具和类库集之2014版

    14年承诺朋友们公开自己常用的工具和类库集,一直没能及时兑现.今天忙里偷个闲,整理了一下清单,在此公布出来,希望能够对大家在.NET.App.Web等开发方面有所帮助.也当是给.NET开发者一个元宵礼 ...

  5. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...

  6. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  7. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)>,我们完成了: * 引用SqlSugar * ...

  8. AutoMapper多个对象映射到一个Dto对象

    一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没有定义在People中,People的Ear属性也不存在与SocialAttribute和P ...

  9. [AutoMapper]反射自动注册AutoMapper Profile

    AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...

最新文章

  1. android gradle 给所有的buildFlavor 的versionName 增加一个后缀
  2. go mysql socket_Go语言实现socket实例
  3. SAP客户合作伙伴关系使用说明
  4. FPGA实验——译码器原理及实现
  5. 从原理上搞懂如何设置线程池参数大小?
  6. [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
  7. 了解ACL(访问控制列表)一些简单的ACL小实验
  8. [Android] 输入系统(二)
  9. 人体姿态估计算法之open pose
  10. DateTime和字符串转换问题
  11. 求最长回文串-从动态规划到马拉车之路(下)
  12. Python中的_main_与_init_详解
  13. mysql 主从同步,双主同步,如果服务器意外挂机,不同步怎么办
  14. C语言Socket编程(计算机网络作业)
  15. CentOS下rsync数据同步备份
  16. 关于MPMoviePlayerController类播放视频时,外放没有声音的问题(ios)
  17. 十大进销存管理软件亮点大对比
  18. [CF838D]Airplane Arrangements
  19. Windows版微信3.3.0内测版更新啦,亲测可刷朋友圈(附内测版)
  20. 测试人员,如何对直播类产品的直播质量进行测试呢?

热门文章

  1. echarts 环状图中添加图片
  2. java.lang.IllegalArgumentException的问题解决
  3. 十大项目管理知识-相关方识别管理
  4. 敏捷-细说敏捷建模思想与实践(转)
  5. 线性电阻电路方程的建立方法
  6. html clear 清楚li,CSS清楚浮动clear:both
  7. C++ 制作简易音乐播放器
  8. stm32L0系统----开发环境搭建
  9. 使用libusb读取鼠标数据
  10. CAJ文献如何转成PDF?免费全篇转换的方法