葡京娱乐总站平台DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

http://www.61ic.com/Mobile/iPhone/201108/36504.html

回去目录


写这篇文章的心思:激动

Objective-C开发之CodeBlocks实例操作
笔者:博客园    文章来源:博客园    点击数:139    更新时间:2011-8-5  
 

Microsoft.Extensions.DependencyInjection在github上一致是开源的,它于dotnetcore里被普遍的使,比打之前的autofac,unity来说,它可以说凡是个包裹,或者给适配器,它好提供了默认的DI实现,同时为支持第三正在的IOC容器,在马上段时间里应用了它,就想,这东西怎么让于dotnetcore里大放异彩?为什么会全程用其?从程序的起交程序启动起来,你可以发现它无处不在,在框架里是这么,在业务层同时为是如此。

Objective-C开发的CodeBlocks实例操作的内容是本文要介绍的情节,主要讲述了CodeBlocks相关的情,先来拘禁详细内容。

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

  1. 它的开源地址
  2. IServiceCollection和IApplicationBuilder
  3. 从定义模块用其
  4. 于Startup.ConfigureServices中注册于定义模块
  5. 当Startup.Configure中利用她,进行默认模块的初始化
  6. 每当随意对象的构造方法中行使它们
  1. 先是安装Objective-C编译器

同样步一步之揭秘

同一 它的开源地址

https://github.com/aspnet/DependencyInjection

可以望她的README.md,就理解其是独雅包裹,类似于父辈LindAgile里的Container,完全可扩大支持其他第三正在的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中登记于定义模块

点的代码主要是于定义一个模块,而当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的享用就顶这边,希望大家为硬着头皮把模块于类型蒙解放出来!

谢谢各位的开卷!

返目录

GNUstep Windows
Installer提供了Windows平台下之Objective-C的模拟出环境,一共发生四只软件包,其中GNUstep
System和GNUstep Core是必装的,GNUstep Devel和Cairo
Backend是选装的。甭管必装选装,一次性全安上,免得以后麻烦。

季只文本都设置至C:GNUstep下

   
http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/gnustep-msys-system-0.25.1-setup.exe
 
     
   
http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/gnustep-core-0.25.0-setup.exe
 
     
   
http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/gnustep-devel-1.1.1-setup.exe
 
     
   
http://ftpmain.gnustep.org/pub/gnustep/binaries/windows/gnustep-cairo-0.22.1-setup.exe

  1. 也Code::Blocks添加编译器

开拓Code::Blocks,点击菜单Settings>Compiler and debugger>Global
compiler settings

当Selected compiler下拉框下面点击Copy, 在弹有窗口被填入: GNUstep MinGW
Compiler

之后,点击Toolchain executables选项卡,将Compiler’s installation
directory选择为C:GNUstepmingwbin

  1. 创建Objective-C工程

创造一个Console的C工程,将main.c删除,新建main.m文件,内容如下:

    #import <Foundation/Foundation.h>
    int main (int argc, const char *argv[]) {  
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
        NSLog(@”Hello World!”);  
        [pool drain];  
        return 0;  
    }

右击main.m点击property,选择Build选项卡,将Compile file与Link
file都从上引起,选择Advanced,将Compiler variable的情节改动呢CC

  1. 安编译选项

(1)方法一

右击将开创的工程,选择Build options…,Selected compiler编译器选择GNUstep
MinGW Compiler, 选择Compiler settings>Other
options中填入-fconstant-string-class=NSConstantString

选择Linker settings选项卡,点击Add,增加如下两履行内容:

    C:/GNUstep/GNUstep/System/Library/Libraries/libobjc.dll.a  
    C:/GNUstep/GNUstep/System/Library/Libraries/libgnustep-base.dll.a

挑Search directories>Compiler,点击Add,增加如下内容:

    C:/GNUstep/GNUstep/System/Library/Headers

(2)方法二

右击将开创的工,选择Build options…,Selected compiler编译器选择GNUstep
MinGW Compiler, 选择Compiler settings>Other options中填入

    -fconstant-string-class=NSConstantString
-IC:/GNUstep/GNUstep/System/Library/Headers  
       -LC:/GNUstep/GNUstep/System/Library/Libraries

选择Linker settings选项卡,在Other linker options中输入-lobjc
-lgnustep-base即可

  1. 增加.m文件类型高亮以及编辑器关联

(1)点击Settings>Editors>Syntax highlighting, 选择Syntax
highlighting for: C/C++,点击Filemasks…,在弹有窗口里在*.m,点OK
挑Matlab,点击Filemasks…,将里面的*.m删除

(2)点击Settings>Environment>Files extension handling,点击*.m,在To
open the file中选择

Open it in a Code::Blocks editor即可。

总结:Objective-C开发之CodeBlocks实例操作的情介绍完了,希望本文对君持有帮助!