.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); }
相關文章
相關標籤/搜索