码迷,mamicode.com
首页 > Web开发 > 详细

.Net Core 依赖注入手记

时间:2019-11-11 18:14:23      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:关注   test   miss   addm   add   factor   conf   特殊   exce   

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

 

.Net Core 依赖注入手记

标签:关注   test   miss   addm   add   factor   conf   特殊   exce   

原文地址:https://www.cnblogs.com/gt1987/p/11835015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!