Доступ к хранилищу из BackgroundJob, вызываемого внутри библиотеки классов - PullRequest
0 голосов
/ 29 марта 2020

Я новичок в Hangfire и обладаю минимальными знаниями о. net - ядро ​​само по себе. Поэтому мне было поручено создать повторяющееся фоновое задание, которое обновляет указанный столбец c в таблице. Я наткнулся на Hangfire и решил использовать его. Я следовал этому учебнику и обновлял методы примерно так:

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

Теперь я нахожусь в контрольно-пропускном пункте. Я не могу понять, как получить доступ к нужным мне репозиториям, чтобы я мог обновлять нужные мне таблицы. Я делаю это правильно? Есть ли способ сделать эту работу?

1 Ответ

1 голос
/ 31 марта 2020

Где находится ваш репозиторий классов. Если они находятся в основном проекте, который имеет ссылку на библиотеку классов, включая класс JobsInitiator, вы не можете. Поскольку у вас есть ссылка только в одном направлении, и в вашем случае вы можете получить доступ к библиотеке классов из вашего основного проекта. Если у вас есть другая библиотека классов, включая ваши репозитории, вы можете добавить ссылку на вашу библиотеку классов (которая включает в себя JobsInitiator) для доступа к слою репозитория.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...