它在dotnetcore里被广大的选择,那东西怎么被在dotnetcore里大显神通

回来目录

回到目录

写那篇文章的激情:激动

写那篇小说的情怀:激动

Microsoft.Extensions.DependencyInjection在github上亦然是开源的,它在dotnetcore里被大面积的采取,比起从前的autofac,unity来讲,它能够说是个包装,只怕叫适配器,它自身提供了默许的DI完毕,同时也帮助第一方的IOC容器,在那段时光里使用了它,就想,这东西怎么被在dotnetcore里大放异彩?为啥会全程选择它?从程序的开始到程序运营起来,你能够发现它无处不在,在框架里是那般,在业务层同时也是那样。

Microsoft.Extensions.DependencyInjection在github上1致是开源的,它在dotnetcore里被普遍的行使,比起此前的autofac,unity而言,它能够说是个包裹,只怕叫适配器,它自个儿提供了默许的DI实现,同时也帮衬第2方的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.ConfigureServices中登记自定义模块
  5. 在Startup.Configure中央银行使它,举行暗许模块的开首化
  6. 在任意对象的构造方法中应用它

一步一步的揭秘

1 它的开源地址

https://github.com/aspnet/DependencyInjection

能够看看它的README.md,就知道它是个大包装,类似于父辈LindAgile里的Container,完全能够扩大扶助任何第2方的IOC容器,那就像是四叔平常说的那句话同样,在IT江湖中,英雄总是所风略同……

图片 1

贰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中登记自定义模块

下面包车型客车代码重假诺自定义2个模块,而在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做的确实不错,给它玖拾玖个赞!

那种注册

    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里进行登记,然后在4意档次中选取它,感觉那一点真正灵活了大多!

明日大家对dotnetcore DependencyInjection的享受就到那边,希望大家也尽或者把模块从品种中解放出来!

感激各位的读书!

回去目录

一步一步的揭破

一 它的开源地址

https://github.com/aspnet/DependencyInjection

可以看看它的README.md,就理解它是个大包装,类似于父辈LindAgile里的Container,完全能够扩充支持别的第1方的IOC容器,那就像大叔平日说的这句话同样,在IT江湖中,英豪总是所风略同……

图片 2

2dotnetcore整个框架在用它

在你的dotnetcore应用程序里,你会意识在Startup类中有繁多像services.AddMvc()那样的办法,那实质是像应用程序中注册三个组件,那里的MVC是3个联结的机件,它不依靠于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框架的3结合能够自定义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;
        }
   }

4在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做的确实不错,给它九十五个赞!

那种注册

    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的享用就到此处,希望我们也硬着头皮把模块从品种中解放出来!

多谢各位的翻阅!

回去目录

相关文章