.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); }