Я пытаюсь использовать 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 без этой строки ...
Я бы очень признателен за любой вклад. Спасибо!