.Net Core 依赖注入手记

  .Net Core自身提供了一套简单的DI框架,能知足咱们DI基本的需求。它依赖如下组件,须要从Nuget包下拉取。html

    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获得它。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); }
相关文章
相关标签/搜索