Интеграция Hangfire Autofac не может разрешить службу с зарегистрированной зависимостью
Я использую Hangfire для запуска фоновой работы, но у меня возникает проблема, когда я пытаюсь использовать интеграцию с автофаком Hangfire и generic для автоматического разрешения службы задач, которая не работает, потому что она не может быть разрешена одной из зависимостей. Я полагаю, потому что я не получаю никакой ошибки.
BackgroundJob.Enqueue<IBackgroundTask>(x => x.RunAsync() );
Если я использую другой способ разрешения myselft, это работает.
var service = ApplicationContainer.Resolve<IBackgroundTask>();
BackgroundJob.Enqueue(() => service.RunAsync() );
Я понял, что в моем конструкторе есть сервис тестирования, который вызывает проблему. Если я удалю службу в конструкторе, служба будет разрешена.
public class ConvertCarteCreditService : IBackgroundTask
{
private readonly ILogger logger;
private readonly ITest testService;
public BackgroundTask(ILogger logger, **ITest test**)
{
this.logger = logger;
this.testService = test;
// this.testService = Startup.Resolve<ITest>();
}
Я настроил автозапуск в классе запуска следующим образом:
public void ConfigureServices(IServiceCollection services)
{
var builder = new ContainerBuilder();
ServiceLayerInstaller.ConfigureServices(builder);
DataLayerInstaller.ConfigureServices(builder, connectionString, readOnlyConnectionString);
builder.RegisterAssemblyTypes(typeof(WorkerRoleInstaller).
GetTypeInfo().Assembly).Where(t => t.Name.EndsWith("Test"))
.AsImplementedInterfaces();
WorkerRoleInstaller.ConfigureServices(builder);
builder.Populate(services);
ApplicationContainer = builder.Build();
var autofacJobActivator = new AutofacJobActivator(ApplicationContainer);
GlobalConfiguration.Configuration.UseActivator(autofacJobActivator);
}
1 ответ
Я обнаружил, что моя проблема в том, что я не возвращал поставщика услуг ** из функции настройки служб, а вместо этого создал функцию как void и ничего не возвращал.
public **IServiceProvider** ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDirectoryBrowser();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
var builder = new ContainerBuilder();
builder.Populate(services);
ServiceLayerInstaller.ConfigureServices(builder);
WorkerRoleInstaller.ConfigureServices(builder);
ApplicationContainer = builder.Build();
var autofacJobActivator = new AutofacJobActivator(ApplicationContainer, false);
GlobalConfiguration.Configuration.UseActivator(autofacJobActivator);
**return new AutofacServiceProvider(ApplicationContainer);**
}