0六、NetCore2.0依賴注入(DI)之整合Autofac

0六、NetCore2.0依賴注入(DI)之整合Autofachtml

除了使用NetCore2.0系統的依賴注入DI)框架外,咱們還能夠使用其餘成熟的DI框架,如Autofac、Unity等。只要他們支持IServiceProvider接口規範。咱們此次嘗試使用Autofac來替代系統DI框架。app

 

------------------------------------------------------------------------------------------------------------框架

 寫在前面:這是一個系列的文章,總目錄請移步:NetCore2.0技術文章目錄async

------------------------------------------------------------------------------------------------------------ide

 

1、安裝支持NetCore2.0的Autofac包ui

使用VS2017建立一個空的MVC項目,準備在這個項目中整合Autofacthis

1.安裝核心包spa

install-package autofaccode

2.安裝擴展包component

install-package Autofac.Extensions.DependencyInjection

就是它支持了IServiceProvider接口規範:

using System; using Microsoft.Extensions.DependencyInjection; namespace Autofac.Extensions.DependencyInjection { public class AutofacServiceProvider : IServiceProvider, ISupportRequiredService { public AutofacServiceProvider(IComponentContext componentContext); public object GetRequiredService(Type serviceType); public object GetService(Type serviceType); }
}

 

2、在Web應用中整合Autofac

系統DI框架入口是Startup.ConfigureServices方法:

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IRun, Run>();

            return services.BuildServiceProvider();
        }

 咱們能夠看出,這個方法配置了IServiceProvider的實現。那麼,咱們的整合方法就是用Autofac實現的IServiceProvider對象,替換系統的IServiceProvider。

        public IContainer ApplicationContainer { get; private set; }

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var builder = new ContainerBuilder();

            // 注入方式1:autofac將全盤接收            
            services.AddSingleton<IRun, Run>();

            // 注入方式2: autofac自行註冊
            //builder.RegisterType<Run>().As<IRun>();

            builder.Populate(services);
            this.ApplicationContainer = builder.Build();

            return new AutofacServiceProvider(this.ApplicationContainer);
        }

 能夠看出,既能夠用原有的方式註冊服務,也能夠用Autofac方式註冊,最後Autofac會全盤接收管理。其中自定義的接口以下:

   interface IRun
    {
        string Show();
    }

    public class Run : IRun
    {
        public string Show()
        {
            return "奔跑吧,兄弟";
        }

    }
View Code

下面咱們在業務中調用這個接口,看是否成功。

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

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(app.ApplicationServices.GetService<IRun>().Show());
            });
        }   

運行效果是ok的^_^,不難體會到,接口的對擴展開放特色。

相關文章
相關標籤/搜索