Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac,unity来说,它可以说是个包裹,或者叫适配器,它自己提供了默认的DI实现,同时也支持第三方的IOC容器,在这段时间里使用了它,就想,这东西为什么被在dotnetcore里大放异彩?为什么会全程使用它?从程序的开始到程序启动起来,你可以发现它无处不在,在框架里是这样,在业务层同时也是这样。

聊聊Microsoft.Extensions.DependencyInjection知识点包括

  1. 它的开源地址

  2. IServiceCollection和IApplicationBuilder

  3. 自定义模块用它

  4. 在Startup.ConfigureServices中注册自定义模块

  5. 在Startup.Configure中使用它,进行默认模块的初始化

  6. 在任意对象的构造方法中使用它

一步一步的揭秘

一 它的开源地址

https://github.com/aspnet/DependencyInjection

可以看看它的README.md,就知道它是个大包裹,类似于大叔LindAgile里的Container,完全可以扩展支持其它第三方的IOC容器,这就像大叔经常说的那句话一样,在IT江湖中,英雄总是所风略同……

二 dotnetcore整个框架在用它

在你的dotnetcore应用程序里,你会发现在Startup类中有很多像services.AddMvc()这样的方法,这实质是像应用程序中注册一个组件,这里的MVC是一个统一的组件,它不依赖于windows,不依赖于dotnet,整个dotnetcore里把很多组件都解耦了,这样在维护和nuget包升级时都更灵活,自己有问题就优化自己,而不影响其它模块。(越说越像微服务的宗旨)。

IServiceCollection主要用来注册服务,就是某个接口和某种实现的对应关系,这种注册是我们在Startup.ConfigureServices方法里完成的,如下面的AddLind()这个方法,它完成了对Lind模块的注册,在方法内部可以注册本模块的其它服务。

        /// <summary>/// 添加Lind框架和它们依赖子模块           /// </summary>/// <param name="services"></param>/// <param name="setupAction"></param>/// <returns></returns>public static LindBuilder AddLind(             this IServiceCollection services,Action<LindOptions> setupAction){             if (setupAction == null) throw new ArgumentNullException(nameof(setupAction));services.Configure(setupAction);             var options = new LindOptions();             //注册框架所依赖的基础模块            //options.Extensions.Add();            //注册外部模块                       setupAction(options);                     foreach (var serviceExtension in options.Extensions)serviceExtension.AddServices(services);services.AddSingleton(options);             return new LindBuilder(services);}

IApplicationBuilder是指对应该程序的启动,或者理解为初始化,当上面的服务注册完成后就执行它了,我们一般在Startup.Configure去激活它,它的目的比较单纯,就是对模块进行初始化,如果没什么特殊的功能,这个代码可以是空的,下面Builder中初始化了日志组件。

        /// <summary>/// 在应用程序中开启-Lind框架               /// </summary>/// <param name="app">The <see cref="IApplicationBuilder" /> instance this method extends.</param>/// <returns>The <see cref="IApplicationBuilder" /> instance this method extends.</returns>public static IApplicationBuilder UseLind(this IApplicationBuilder app){             if (app == null)                throw new ArgumentNullException(nameof(app));            var provider = app.ApplicationServices;             //注册Lind框架所需要的底层服务LoggerFactory.SetLogger((ILogger)provider.GetService(typeof(ILogger)));            return app;}

三 自定义模块用它

如果希望定义自己的功能模块实现与dotnetcore框架的结合可以自定义Options和OptionsExtensions,前者主要实现的是服务列表的注册,而后台主要是对现有模块提供注册的入口,下面的代码主要实现了一个EF仓储模块的注册过程。

模块所需的模型

    public class RepositoryOptions{        public string ConnString { get; set; }}

注册服务列表

    /// <summary>/// 注册有关-EF仓储的服务列表       /// </summary>public class EFOptionsExtension : ILindOptionsExtension{             private readonly Action<RepositoryOptions> _configure;          public EFOptionsExtension(Action<RepositoryOptions> configure){_configure = configure;}       

  public void AddServices(IServiceCollection services){services.AddSingleton(typeof(IRepository), typeof(EFRepository));            var mysqlOptions = new RepositoryOptions();_configure(mysqlOptions);}}

在外部使用这个模块,就是在Startup中注册它

  public static class RepositoryOptionsExtensions{             public static LindOptions UseEF(this LindOptions options, Action<RepositoryOptions> configure){options.RegisterExtension(new EFOptionsExtension(configure));                 return options;}}

四 在Startup.ConfigureServices中注册自定义模块

上面的代码主要是自定义一个模块,而在startup中使用它,就像下面的代码,十分简洁,当前有些配置信息可以到在基于环境变量的json文件里!

       public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddLind(x =>{x.UseEF(o =>{o.ConnString = "localhost:1433";});x.UseDapper(o =>{o.ConnString = "localhost:3306";});});}

五 在Startup.Configure中使用它,进行默认模块的初始化

上面的代码实现了对模块下一些服务进行注册,然后下面代码主要是进行一些初始化的工作。

       public void Configure(IApplicationBuilder app, IHostingEnvironment env){            if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();app.UseLind();}

六 在任意对象的构造方法中使用它

当我们把服务注册后,可以在任意类型的构造方法中使用它,而不是只能在控制器中使用,这一点dotnetcore DI做的确实不错,给它100个赞!

这种注册

    public class ApiLoggerOptionsExtension : IPilipaOptionsExtension{Action<ApiLoggerConfig> _config;         public ApiLoggerOptionsExtension(Action<ApiLoggerConfig> config){_config = config;}        public void AddServices(IServiceCollection services){ApiLoggerConfig apiLoggerConfig = new ApiLoggerConfig();_config(apiLoggerConfig);//装饰services.AddSingleton(apiLoggerConfig);//注册对象里的属性,在对象的构造方法被注入services.AddSingleton(typeof(ILogger), typeof(ApiLogger));//注册对象,在使用对象的类的构造方法被注入        }}

这种使用

        ApiLoggerConfig _config;   

        public ApiLogger(ApiLoggerConfig config){_config = config;}

对于上面的代码实现了在OptionsExtension里进行注册,然后在任意类型中使用它,感觉这点确实灵活了不少!

今天咱们对dotnetcore DependencyInjection的分享就到这里,希望大家也尽量把模块从项目中解放出来!

原文地址: http://www.cnblogs.com/lori/p/7651787.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

一起聊聊Microsoft.Extensions.DependencyInjection相关推荐

  1. 使用微软依赖注入器Microsoft.Extensions.DependencyInjection

    目录 注册服务到容器 调用 ASP.NET Core MVC调用参考,构造函数注入 注册服务到容器 using Microsoft.Extensions.DependencyInjection; us ...

  2. [转载]ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection

    这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础, ...

  3. ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection

    这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础, ...

  4. 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0

    解决方法:工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions ...

  5. Quartz.Net+Microsoft.Extensions.Hosting创建服务

    1.首先准备Nuget包: Microsoft.Extensions.Hosting.WindowsServices Microsoft.Extensions.Logging.Log4Net.AspN ...

  6. .NET Core项目读取配置文件使用Microsoft.Extensions.Configuration

    配置文件config.xml: <?xml version="1.0" encoding="utf-8" ?> <!--配置文件不允许有&am ...

  7. 依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection

    既然是依赖注入容器,必然会涉及到服务的注册,获取服务实例,管理作用域,服务注入这四个方面. 服务注册涉及如何将我们的定义的服务注册到容器中.这通常是实际开发中使用容器的第一步,而容器本身通常是由框架来 ...

  8. 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入

    转载来源 http://www.cnblogs.com/xiaoliangge/p/7642372.html ASP.net Core自带DI(依赖注入),用法如下: services.AddScop ...

  9. Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能

    前言 在使用PRISM+WPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能.无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关 ...

最新文章

  1. html5手机端的点击弹出侧边滑动菜单代码
  2. 03_数据的特征抽取,sklearn特征抽取API,字典特征抽取DictVectorizer,文本特征抽取CountVectorizer,TF-IDF(TfidfVectorizer),详细案例
  3. gptuefi优势_UEFI+GPT的区别,有啥不同?写的很详细易懂
  4. asp.net httprequest httpresponse
  5. java中的异常处理代码,java_深入剖析Java中的各种异常处理方式,1. 调试追踪代码:public s - phpStudy...
  6. 核心频率个加速频率_AMD 32核心频率飞起!Intel
  7. web.xml 报错
  8. php二分查找法实例
  9. 【万用表识别】基于matlab数字仪表识别【含Matlab源码 693期】
  10. qcc300x笔记之固件升级(六)
  11. P1359 租用游艇 洛谷
  12. 龚本灿c语言程序设计,c语言程序设计初步-求索学堂.ppt
  13. win10计算机网络设置在哪,Win10系统电脑中的网络状态在哪里查看
  14. android界面设计所用中文什么字体,手机软件中的字体是什么字体,ui界面设计用什么字体...
  15. 英语文献超过3个作者_TPR英语启蒙的3个误区,你都知道吗?
  16. 【01.14】网络安全学习day3
  17. 洛谷1967 火车运输 kruskal求最大生成树 倍增LCA维护最小值
  18. 周赛题1(leetcode)
  19. Java调用Google Analytics API实现网站统计
  20. IBM Installation Manager安装的几种安装方式

热门文章

  1. 【292天】跃迁之路——程序员高效学习方法论探索系列(实验阶段50-2017.11.24)...
  2. OpenGL® ES 3.0 Programming Guide - Book Website
  3. 王彪20162321 2016-2017-2 《程序设计与数据结构》第5周学习总结
  4. WWDC 2013 Session笔记 - Xcode5和ObjC新特性
  5. Java类的继承总结
  6. 重学数据结构004——栈的基本操作及实现(数组实现)
  7. 打独立运行包遇到无法trim咋解决
  8. Visual Studio 2022 Preview 3和2019 16.11发布
  9. Dotnet Core 优雅的命令行实现
  10. 在 .NET 6 Preview 3 ASP.NET Core 更新