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 "奔跑吧,兄弟"; } }
下面咱們在業務中調用這個接口,看是否成功。
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的^_^,不難體會到,接口的對擴展開放特色。