Интеграция 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);**
    }
Другие вопросы по тегам