从类库内部调用的BackgroundJob访问存储库

问题描述 投票:0回答:1

我是新手,对.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;
        }
    }

现在我处于障碍之中。我不能全神贯注于如何访问所需的存储库,因此可以更新所需的表。我这样做对吗?有没有办法使这项工作呢?

c# .net .net-core hangfire
1个回答
0
投票

您的存储库类在哪里。如果它们在Main项目中并且引用了类库(包括JobsInitiator类),则不能。由于您只能参考一个方向,因此您可以从主项目访问类库。如果您还有另一个包含库的类库,则可以将引用添加到类库(包括JobsInitiator的库)以访问存储库层。

© www.soinside.com 2019 - 2024. All rights reserved.