在项目中有一个需求。我的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个对象。
一个在管道头部(负责注入) 一个在管道末端(负责使用)
而现在我们使用场景是在使用前。所以需要使用到 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)
}
}
这样就可以在启动时。将服务注入到我们需要使用的类。