在那段时间里选择了它,在那段时日里使用了它

回来目录

回到目录

写这篇小说的心理:激动

写那篇小说的心思:激动

Microsoft.Extensions.DependencyInjection在github上一致是开源的,它在dotnetcore里被广泛的施用,比起在此以前的autofac,unity来说,它能够说是个包装,或然叫适配器,它和谐提供了暗中同意的DI完结,同时也支撑第二方的IOC容器,在那段时光里应用了它,就想,那东西怎么被在dotnetcore里大放异彩?为啥会全程选拔它?从程序的上马到程序运行起来,你可以窥见它无处不在,在框架里是那般,在业务层同时也是那样。

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. 在随意对象的构造方法中选用它

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

  1. 它的开源地址
  2. IServiceCollection和IApplicationBuilder
  3. 自定义模块用它
  4. 在Startup.Configure瑟维斯s中登记自定义模块
  5. 在Startup.Configure中运用它,进行暗中认可模块的初步化
  6. 在随意对象的构造方法中采用它

一步一步的揭秘

一 它的开源地址

https://github.com/aspnet/DependencyInjection

能够看看它的README.md,就知晓它是个大包装,类似于父辈LindAgile里的Container,完全可以扩展帮助任何第一方的IOC容器,那就好像二伯常常说的那句话一样,在IT江湖中,好汉总是所风略同……

图片 1


dotnetcore整个框架在用它

在您的dotnetcore应用程序里,你会发觉在Startup类中有为数不少像services.AddMvc()那样的方法,这精神是像应用程序中登记3个零部件,那里的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中注册自定义模块

地方的代码主尽管自定义3个模块,而在startup中运用它,就像上面的代码,13分精简,当前不怎么配置新闻方可到在依据环境变量的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做的的确不错,给它九1七个赞!

那种注册

    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的享受就到此处,希望大家也尽量把模块从体系中解放出来!

多谢各位的开卷!

回到目录

一步一步的揭破

一 它的开源地址

https://github.com/aspnet/DependencyInjection

能够看看它的README.md,就知晓它是个大包裹,类似于父辈LindAgile里的Container,完全能够扩张帮衬任何第二方的IOC容器,那就好像三叔平时说的那句话一样,在IT江湖中,英雄总是所风略同……

图片 2


dotnetcore整个框架在用它

在你的dotnetcore应用程序里,你会意识在Startup类中有诸多像services.AddMvc()那样的点子,那实质是像应用程序中登记3个组件,那里的MVC是二个集合的零部件,它不依靠于windows,不依靠于dotnet,整个dotnetcore里把众多零件都解耦了,那样在保安定祥和nuget包升级时都更灵活,本人万分就优化自个儿,而不影响其余模块。(越说越像微服务的大旨)。

IServiceCollection首要用于注册服务,就是有个别接口和某种完毕的相应关系,那种注册是大家在Startup.Configure瑟维斯s方法里实现的,如上边包车型大巴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中登记自定义模块

地点的代码重借使自定义3个模块,而在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做的确实不易,给它9九个赞!

那种注册

    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的分享就到那里,希望大家也尽量把模块从项目中解放出来!

谢谢各位的阅读!

回来目录