.Net Core自身提供了一套简单的DI框架,能满足我们DI基本的需求。它依赖以下组件,需要从Nuget包下拉取。
Microsoft.Extensions.DependencyInjection.Abstractions
其中有2个比较重要的对象,ServiceCollection和ServiceProvider。前者是DI容器,代表这个各个服务实例的集合,提供了一些基本注入方式,如下示例
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); //任意一个ServiceProvider下取得的实例都相同 services.AddSingleton<IBookDAL, MemoryBookDAL>(); //每一次从ServiceProvider取得,均返回一个新的实例
services.AddTransient<IBookDAL2, MemoryBookDAL2>(); //在同一作用域下生成的实例相同,即同一个ServiceProvider下取得的实例相同
services.AddScoped<IBookDAL3, MemoryBookDAL3>();
//获取Service var s= services.BuildServiceProvider().GetService<IBookDAL>(); }
后者负责Service实例的维护,包括创建和销毁。这个对象也提供了集成第三方组件的扩展点。可以由IServiceCollection接口的扩展方法BuildServiceProvider得到它。
这就是.Net Core自身的DI框架的一些基本情况,使用很简单。在日常开发过程中,我们可能会用到一些专业性更高的DI组件,我们这里使用Autofac来尝试集成看看。
首先Nuget包,别拉错了。
Autofac.Extensions.DependencyInjection
集成方式如下,ConfigureServices方法需要返回 IServiceProvider。特别关注下 builder.Populate(services); 注释说明
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); }