.Net Core自身提供了一套簡單的DI框架,能知足咱們DI基本的需求。它依賴如下組件,須要從Nuget包下拉取。html
Microsoft.Extensions.DependencyInjection.Abstractions
其中有2個比較重要的對象,ServiceCollection和ServiceProvider。前者是DI容器,表明這個各個服務實例的集合,提供了一些基本注入方式,以下示例框架
後者負責Service實例的維護,包括建立和銷燬。這個對象也提供了集成第三方組件的擴展點。能夠由IServiceCollection接口的擴展方法BuildServiceProvider獲得它。ide
這就是.Net Core自身的DI框架的一些基本狀況,使用很簡單。在平常開發過程當中,咱們可能會用到一些專業性更高的DI組件,咱們這裏使用Autofac來嘗試集成看看。ui
首先Nuget包,別拉錯了。spa
Autofac.Extensions.DependencyInjection
集成方式以下,ConfigureServices方法須要返回 IServiceProvider。特別關注下 builder.Populate(services); 註釋說明code
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(cfg => { var filter = ApplicationContainer.Resolve<DefaultExceptionFilterAttribute>(); //var filter = services.BuildServiceProvider().GetService<DefaultExceptionFilterAttribute>(); if (filter != null) cfg.Filters.Add(filter); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); var serviceProvider = AutoFacRegister(services); return serviceProvider; }
public IContainer ApplicationContainer { get; private set; } public IServiceProvider AutoFacRegister(IServiceCollection services) { var builder = new ContainerBuilder(); //very import //正常返回IServiceProvider 並不能替代原IServicePrivder。還須要自定義ServiceScopeFactory保證RequestServices返回的也是你自定義的ServiceProvider。 //詳細見https://www.cnblogs.com/artech/p/3rd-party-di-integration.html //此處autofac作了特殊處理 builder.Populate(services); builder.RegisterType<MemoryBookDAL>().As<IBookDAL>().SingleInstance(); builder.RegisterType<TestPermissionCheckService>().As<IPermissionCheckService>().SingleInstance(); builder.RegisterType<PermissionCheckAuthorizationHandler>().As<IAuthorizationHandler>(); builder.RegisterType<DefaultExceptionFilterAttribute>(); builder.RegisterType<GlobalApiLoggingMiddleware>(); builder.RegisterType<GlobalExceptionMiddleware>(); ApplicationContainer = builder.Build(); return new AutofacServiceProvider(ApplicationContainer); }