Как настроить Hangfire с использованием Asp.Net 4.7 и DI с Microsoft.Extensions.DependencyInjection? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать Hangfire с Microsoft.Extensions.DependencyInjection в приложении Asp.Net 4.7.2 MVC. У меня есть настройка DI и работает, я просто не могу правильно настроить Hangfire. Приведенная ниже текущая реализация запускает информационную панель, но выполнение фоновой задачи возвращает ошибку: JobActivator возвратил NULL-экземпляр типа 'Dh.Web.Services.EmailService'.

Я знаю, что EmailService правильно настроен в DI, потому что яможет получить к нему доступ с помощью DI в том же контроллере, который вызывает метод BackgroundJob.Enqueue.

Моя реализация:

HangfireActivator.cs

    public class HangfireActivator : JobActivator
    {
        private readonly IServiceProvider _serviceProvider;

        public HangfireActivator(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public override object ActivateJob(Type type)
        {
            return _serviceProvider.GetService(type);
        }
    } 

Метод ConfigureHangfire внутри startup.cs

        private void ConfigureHangfire(IServiceProvider serviceProvider, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["Dh"].ConnectionString;

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseActivator(new HangfireActivator(serviceProvider))
                .UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
                    {
                        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                        QueuePollInterval = TimeSpan.FromSeconds(10),
                        UseRecommendedIsolationLevel = true,
                        UsePageLocksOnDequeue = true,
                        DisableGlobalLocks = true,
                    }
                );

            app.UseHangfireServer(new BackgroundJobServerOptions {WorkerCount = 3});

            var options = new DashboardOptions()
            {
                Authorization = new[] {new SystemAuthorizationFilter()}
            };
            app.UseHangfireDashboard("/hangfire",options);
        }

и, наконец, Метод конфигурации в Startup.cs

        public void Configuration(IAppBuilder app)
        {
            var services = new ServiceCollection();

            //App DI 
            ConfigureServices(services);

            var serviceProvider = services.BuildServiceProvider();
            var resolver = new DefaultDependencyResolver(serviceProvider);
            DependencyResolver.SetResolver(resolver);

            //Hangfire
            ConfigureHangfire(serviceProvider,app);
        }

У меня естьПодозрение, что это строка: var serviceProvider = services.BuildServiceProvider();, которая создает отдельного поставщика услуг, на который я установил все свои DI приложения, но я не знаю, как получить ServiceProvider для опции UseActivator в Hangfire без этой строки ...

Я бы очень признателен за любой вклад. Спасибо!

1 Ответ

0 голосов
/ 03 октября 2019

Я зарегистрировался в своем DI: services.AddTransient<IEmailService,EmailService>();

Однако добавление этого для регистрации конкретного класса без интерфейса сработало. services.AddTransient<EmailService>();

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