.Net Core 中在管道末端Configure中使用服务

 在项目中有一个需求。我的HangFire启动的一个定时任务。使用到了服务。服务定义为构造注入。
 这就导致在启动Hangfire的任务基类时。我需要注入服务到这个类。

  //hangfire启动的服务类

  public class Work
  {
        public Work(IServer sever) : base(Sever)
        {
            //需要使用到服务所以要注入进来
        }

        /// 
        /// 给Hangfire添加works
        /// 
        public void HangFrieJobs()
        {
          FengPinSendWork.SynchronizationStart(), Jobs.CycleCronType.Minute(5));
            Jobs.CycleJob.AddOrUpdate("这是一个定时任务", () => new NewCompanyRestListController(sever).ICMUpdateInfoToElasticsearch(), Jobs.CycleCronType.Minute(10));
        }
   }
     //注入hangfire
     public void ConfigureServices(IServiceCollection services)
     {         
         //配置定时任务管理器
         services.AddHangfire(x => x.UseStorage(new MongoStorage(MongoClientSettings.FromConnectionString(Configuration["MongoContext:ConnectionString"]), Configuration["MongoContext:Database"]
               , new MongoStorageOptions
               {
                   QueuePollInterval = TimeSpan.FromSeconds(15),             //- 作业队列轮询间隔。默认值为15秒。
                   JobExpirationCheckInterval = TimeSpan.FromHours(1),       //- 作业到期检查间隔(管理过期记录)。默认值为1小时。
                   CountersAggregateInterval = TimeSpan.FromMinutes(5),      //- 聚合计数器的间隔。默认为5分钟。
                   Prefix = "Hangfire"                                  //- 数据库中表的前缀。默认为none
          })));             
     }

 

     //使用hangfire
     public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
     {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
           
            //配置hangfire访问路径
            app.UseHangfireServer();
            app.UseHangfireDashboard("/hangfire", new DashboardOptions
            {
                Authorization = new[]
                {
                    new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
                        {
                            SslRedirect = false,          // 是否将所有非SSL请求重定向到SSL URL
                            RequireSsl = false,           // 需要SSL连接才能访问HangFire Dahsboard。强烈建议在使用基本身份验证时使用SSL
                            LoginCaseSensitive = false,   //登录检查是否区分大小写
                            Users = new[]
                            {
                                new BasicAuthAuthorizationUser
                                {
                                    Login ="admin",//用户名
                                    PasswordClear="admin123456"
                                }
                            }
                        })
                }
            });
            
            app.UseMvc();

            new Affair.AffairWorks().HangFrieJobs();//定时或周期任务注册;
            
      }

 因为我的hangfire服务引用了 服务。所以这样启动会报错。所以我需要在启动服务前。将我的服务注册进去。
 而 HangFire的使用是在管道的末端。所以我要在Hangfire服务的启动前进行注入。才可以让启动的HangFire服务不报错。
 (微服务是微软 封装过的。只需要在管道前端注入。不需要在末端使用)
 首先我们要了解一下。.net core中的管道这一概念。而在管道中有2个对象。

  一个在管道头部(负责注入)   一个在管道末端(负责使用)

  • IServiceCollection 负责注册 (注入)
  • IServiceProvider 负责提供实例 (使用)

   而现在我们使用场景是在使用前。所以需要使用到 IServiceProvider 对象 所以需要以下操作
   1) 在使用对象新建一个管道的作用域。
   2)   在这个作用域中获取到我们之前在 注入对象中已经注入进去的服务。
   3)   创建我需要的hangfire 服务。将需要的服务注入进去


     public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
     {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
           
            //配置hangfire访问路径
            app.UseHangfireServer();
            app.UseHangfireDashboard("/hangfire", new DashboardOptions
            {
                Authorization = new[]
                {
                    new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
                        {
                            SslRedirect = false,          // 是否将所有非SSL请求重定向到SSL URL
                            RequireSsl = false,           // 需要SSL连接才能访问HangFire Dahsboard。强烈建议在使用基本身份验证时使用SSL
                            LoginCaseSensitive = false,   //登录检查是否区分大小写
                            Users = new[]
                            {
                                new BasicAuthAuthorizationUser
                                {
                                    Login ="admin",//用户名
                                    PasswordClear="admin123456"
                                }
                            }
                        })
                }
            });
            
          app.UseMvc();

          using (var scope = serviceProvider.CreateScope())   //创建一个新的使用管道作用域  1)
          {
                var sever = scope.ServiceProvider             //获取对象   2)
                        .GetRequiredService();
                new Affair.AffairWorks(sever).HangFrieJobs(); //注入进去   3)
          }
            
      }

  这样就可以在启动时。将服务注入到我们需要使用的类。

你可能感兴趣的:(学习总结,.Net,Core)