Как внедрить IHostedService в инъекцию зависимости от модуля Autofac - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь использовать контейнер Autofac Di для построения зависимостей вместо .netcore по умолчанию IServiceCollection. Мне нужно ввести IHostedService. IServiceCollection имеет метод AddHostedService, но я не могу найти альтернативный метод в Autofac ContainerBuilder.

Документация Autofac говорит, что вы можете заполнить ContainerBuilder из IServiceCollection, поэтому одним из решений было бы добавить IHostedService в IServiceCollection, а затем заполнить из него ContainerBuilder, но у меня есть несколько AutofacModule, некоторые из которых регистрируют друг друга, и каждый из них несет ответственность для их услуг и для внедрения какой-либо службы из ChildModule непосредственно в автозагрузке не представляется правильным.

 public class ParentModule : Module
 {
    protected override void Load(ContainerBuilder builder)
    {
       builder.RegisterModule(new ChildModule());
    }
 }

 public class ChildModule : Module
 {
    protected override void Load(ContainerBuilder builder)
    {
       //TODO Add hosted service here.
    }
 }

 public class Startup
 {
   ...
   ...
   public IServiceProvider ConfigureServices(IServiceCollection services)
   {
      var container = new ContainerBuilder();
      container.RegisterModule(new ParentModule());

      return new AutofacServiceProvider(container.Build());
   }
   ...
   ...
 }

В конце концов я хочу упаковать ParentModule в пакет и загрузить его в собственный NugetServer, чтобы я мог просто добавить ParentModule, где бы он мне ни понадобился, не забывая добавлять некоторые сервисы в IServiceCollection.

Мои модули очень сложны и имеют многоуровневую глубину, поэтому простой метод расширения для IServiceCollection для добавления дополнительных зависимостей невозможен.

1 Ответ

4 голосов
/ 07 мая 2019

Просто зарегистрируйте их следующим образом

builder.Register<MyHostedService>()
       .As<IHostedService>()
       .InstancePerDependency();

Веб-хост заботится о разрешении всех этих регистраций IHostedService и запускает их.

Метод расширения AddHostedService<THostedService> не подходитчто-нибудь другое, как вы можете видеть

public static IServiceCollection AddHostedService<THostedService>(this IServiceCollection services)
where THostedService : class, IHostedService
{
   return services.AddTransient<IHostedService, THostedService>();
}

Вы можете найти исходный код на github .

...