我是新手,对.net-core本身知之甚少。因此,我受命创建一个经常性的后台作业,以更新表上的特定列。我偶然发现了篝火并选择使用它。我遵循了此tutorial并更新了如下方法:
Startup.cs:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add Hangfire services.
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(_appConfiguration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
}));
// Add the processing server as IHostedService
services.AddHangfireServer();
. . . . . . .
public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseAbp(options => { options.UseAbpRequestLocalization = false; }); // Initializes ABP framework.
app.UseHangfireDashboard();
. . . .
现在,我所做的是创建一个类库,该类库将处理要运行的后台作业并按如下方式调用它:
Startup.cs:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add Hangfire services.
services.AddHangfire(configuration => configuration
. . . .
);
// Add the processing server as IHostedService
services.AddHangfireServer();
//this one ↓
//process backgroundjobs queue
var jobInit = new JobsInitiator(_appConfiguration);
jobInit.InitiateQueue();
JobsInitiator.cs:(此类位于我的应用程序的Web.Host项目之外的类库项目中)
public class JobsInitiator {
private readonly IMonitoringApi _monitoringApi;
private readonly IConfiguration Configuration;
public JobsInitiator(IConfiguration _config) {
Configuration = _config;
JobStorage.Current = new SqlServerStorage(Configuration.GetConnectionString("HangfireConnection"));
_monitoringApi = JobStorage.Current.GetMonitoringApi();
}
public void InitiateQueue() {
List<BackgroundJobBase> jobs = GetJobsForQueue();
foreach (BackgroundJobBase job in jobs) {
string jobName = job.JobName;
RecurringJob.AddOrUpdate(jobName, () => job.StartJob(), Helper.GetRecurrenceFromConfig(Configuration, jobName));
//Hangfire.Storage.Monitoring.JobDetailsDto jobDetails = _monitoringApi.JobDetails(jobName);
}
}
public List<BackgroundJobBase> GetJobsForQueue() {
List<BackgroundJobBase> jobs = new List<BackgroundJobBase>();
// Add background jobs here...
jobs.Add(new Jobs.SomeJobToBeDone(Configuration));
return jobs;
}
}
现在我处于障碍之中。我不能全神贯注于如何访问所需的存储库,因此可以更新所需的表。我这样做对吗?有没有办法使这项工作呢?
您的存储库类在哪里。如果它们在Main项目中并且引用了类库(包括JobsInitiator类),则不能。由于您只能参考一个方向,因此您可以从主项目访问类库。如果您还有另一个包含库的类库,则可以将引用添加到类库(包括JobsInitiator的库)以访问存储库层。