一起聊聊Microsoft.Extensions.DependencyInjection

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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这 10 道 Spring Boot 常见面试题你需要了解下

转载自 这 10 道 Spring Boot 常见面试题你需要了解下 1.什么是Spring Boot&#xff1f; 多年来&#xff0c;随着新功能的增加&#xff0c;spring变得越来越复杂。只需访问https://spring.io/projects页面&#xff0c;我们就会看到可以在我们的应用程序中使用的所有Spring项…

【git】如何给github绑定ssh

首先在git上输入 &#xff1a; ssh-keygen 会在c盘的用户账号的文件夹.ssh上生成两个密钥 &#xff08;如果没有生成&#xff0c;请注意自己是否按了enter&#xff0c;出现一个小方框为止&#xff09; 将.pug用笔记本打开 全选复制 来到github的设置上 将刚刚复制的东西黏…

nssl1231-Gift【01背包,dp】

正题 题目大意 n个物品&#xff0c;每个物品有cic_ici​元&#xff0c;求有多少种方案数使得无法再买另外任何的东西。 解题思路 我们发现其实对于每种方案判断只需要考虑剩下的最小的哪一个&#xff0c;所以我们可以将ccc从小到大排序。然后用fi,jf_{i,j}fi,j​表示选择了1∼…

【杭州】Hack for Cloud Beginner微软黑客松大赛

在这美丽的西子湖畔&#xff0c;我们欢迎各行各业的开发者参与此次Hack for Cloud Beginner微软黑客松大赛。我们致力于为开发者们提供在技术、社区领域中的交流平台&#xff0c;重在参与&#xff0c;意于创新。 此次黑客松大赛将于10月22日在中国杭州拉开帷幕&#xff0c;参与…

Java高级开发必会的50个性能优化的细节(珍藏版)

转载自 Java高级开发必会的50个性能优化的细节&#xff08;珍藏版&#xff09; 在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。 ● 1. 尽量在合适的场合使用单例…

nssl1232-函数【数论,欧拉函数,莫比乌斯反演】

正题 题目大意 ∑d∣nf(d)n\sum_{d|n}f(d)nd∣n∑​f(d)n 对于n个aia_iai​ 求 ∑i1nf(ai)\sum_{i1}^nf(a_i)i1∑n​f(ai​) 解题思路——莫比乌斯反演 这个方法对于aia_iai​比较大时比较好用&#xff0c;但是事实证明本题过不了。 用莫比乌斯反演可得到此公式 f(n)∑d∣nμ(…

从0部署一个动态网站

准备&#xff1a;购买域名和服务器 下载软件&#xff1a;服务器上下载宝塔面板和xampp 首先区分动态网站和静态网站区别&#xff1a;动态网站是指数据可以交互的&#xff0c;根据不同的人出现不同的页面&#xff0c;要用到数据库和php。登录注册是动态网站最基础的部分 而静态…

最新的.NET Framework聚焦于改进可访问性

Microsoft宣布预发布.NET Framework 4.7.1&#xff0c;其中包括了各种全面的改进。这里&#xff0c;我们关注一下在WPF应用可访问性上所做的改进。改进的设想针对领域是屏幕报读器&#xff08;Screen Reader&#xff09;和高对比度场景。Microsoft的Preeti Krishna表示&#xf…

MYSQL 入门全套

转载自 MYSQL 入门全套 MySQL简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&am…

nssl1230-序列【位运算】

正题 题目大意 长度为n的序列&#xff0c;求两个长度大于等于kkk的连续序列&#xff0c;一个位运算“和”后最大的答案&#xff0c;和“或”后最大的答案。 解题思路 首先ororor baorxba\ or\ xba or x的话&#xff0c;b⩾ab\geqslant ab⩾a 所以答案就是所有的或起来 然后a…

ImageSharp一个专注于NetCore平台图像处理的开源项目

今天大家分享的是一个专注于NetCore平台图像处理的开源项目&#xff0c;老实说为这篇文章取名字想了5分钟&#xff0c;可能是词穷亦或是想更好的表达出这款开源项目的作用&#xff1b;这个项目在图像处理方面有很多功能&#xff0c;如&#xff1a;缩放&#xff0c;裁剪&#xf…

【开源组件】一份值得收藏的的 MySQL 规范

转载自 【开源组件】一份值得收藏的的 MySQL 规范 数据命名规范 所有数据库对象名称必须使用小写字母并用下划线分割。 所有数据库对象名称禁止使用 MySQL 保留关键字&#xff08;如果表名中包含关键字查询时&#xff0c;需要将其用单引号括起来&#xff09;。 数据库对象的…

vue前期知识点笔记

学习Vue生命周期函数&#xff0c;并且逐个使用&#xff1b; 用路由完成视图的切换&#xff1b; v-bind和v-mode区别 一个绑定的是尖括号外的&#xff0c;一个绑定的是尖括号里的举例&#xff1a; <img :src"url"><h1 v-model"message">{{me…

ssl提高组周六备考赛【2018.10.27】

前言 高三dalao试图混入其中 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself2052052052525258080801001001002222013lyy2013lyy2013lyy2002002001001001007070703030303332015hjw2015hjw2015hjw1201201203030309090900004442…

关于 JVM 内存的 N 个问题

转载自 关于 JVM 内存的 N 个问题 JVM的内存区域是怎么划分的&#xff1f; JVM的内存划分中&#xff0c;有部分区域是线程私有的&#xff0c;有部分是属于整个JVM进程&#xff1b;有些区域会抛出OOM异常&#xff0c;有些则不会&#xff0c;了解JVM的内存区域划分以及特征&am…

RedHat宣布支持Azure、.Net Core 2.0和SQL Server 2017

近期&#xff0c;Microsoft和RedHat宣布支持在Red Hat OpenShift上运行Windows容器。此次宣布所针对的主要场景&#xff0c;是让Linux和Windows容器工作于同一集群中。这将使具有混杂环境的企业无需分别运行Windows集群和Linux集群&#xff0c;企业可以迁移到基于容器的同一种架…

安装webpack

全局安装 npm install -g webpack 项目中安装 npm install --save-dev webpack 安装webpack遇到个坑&#xff0c;问题的话应该是项目使用的是webpack2.X版本&#xff0c;这样就会覆盖之前的版本&#xff0c;导致项目配置错误。 所以最好不要用全局安装 cd进相关文件夹后 cnpm …

如何求解两个数的最大公约数

#include <iostream> using namespace std; //暴力法求解最大公约数 int main() {int m,n,t;cout<<"请输入两个整数&#xff1a;";cin>>m>>n;if(m<n){int tempm;mn;ntemp;}for(int in;i>1;i--){if(m%i0&&n%i0){ti;break;}}cou…

【附答案】Java面试2019常考题目汇总(一)

转载自 【附答案】Java面试2019常考题目汇总&#xff08;一&#xff09; 一、JAVA基础篇-概念 1.简述你所知道的Linux&#xff1a; Linux起源于1991年&#xff0c;1995年流行起来的免费操作系统&#xff0c;目前&#xff0c; Linux是主流的服务器操作系统&#xff0c; 广泛…

2017中国开源年会(COSCon'17) 报名正式开启

继成功举办了2015年中国开源年会暨阿帕奇中国路演&#xff0c;及2016年中国开源年会之后&#xff0c;开源社再接再厉主办的2017中国开源年会 (COSCon17-China Open Source Conference 2017) 将于今年11月18-19日&#xff08;周六-周日&#xff09;在上海交大闵行校区陈瑞球楼举…