Как я могу использовать существующий контейнер DI на новом хосте в ASP.NET Ядро?

#c# #asp.net-core #dependency-injection #.net-5

Вопрос:

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

 public class BackgroundWebHost : BackgroundService {  private readonly IServiceCollection _services;   public BackgroundWebHost (IServiceCollection services)  {  _services = services;  }  

Затем у меня есть этот частный метод для создания хоста, который затем запускается асинхронно в ExecuteAsync методе моей фоновой службы.

 private IHost CreateHost(string[] args) {  return Host.CreateDefaultBuilder(args)  .ConfigureWebHostDefaults(webBuilder =gt;  {  webBuilder.ConfigureKestrel(options =gt;  {  options.ListenAnyIP(4999, listenOptions =gt;  {  listenOptions.Protocols = HttpProtocols.Http2;  });  });  webBuilder.UseStartuplt;Startupgt;();  })  .Build(); }  

Startup Используемый содержит конфигурацию приложения, но дополнительные службы могут быть зарегистрированы в контейнере DI более крупного приложения с использованием открытого API более крупного хост-приложения.

Этот процесс отлично работает, чтобы открыть порт 4999 и принять соединения Http2. Однако я хочу использовать зависимости, зарегистрированные в более крупном хост-приложении, которые зарегистрированы в IServiceCollection _services моей фоновой службе. Я попытался просмотреть их и добавить каждую службу в контейнер, созданный хостом фоновой службы, но это занимает слишком много времени для запуска и занимает много памяти, так как у более крупного хост-приложения зарегистрировано более 1000 зависимостей. Я полагаю, что должно быть возможно создать хост с контейнером DI, ссылающимся на тот же, что и его родитель. Есть какие-нибудь идеи о том, как это можно сделать?

Правка: Я должен уточнить, что я никоим образом не могу изменить более крупное хост-приложение, так как мое приложение является плагином.

Комментарии:

1. Возможно, вы сможете что-то сделать с ан IServiceProviderFactory .

2. Возможно, изменить Program.cs , чтобы запустить два веб-хоста, вместо того, чтобы превращать один хост в фоновую службу другого, хотя синглтоны не будут разделяться между хостами

3. @Llama, я рассмотрел этот вариант, но я не могу понять, как будет выглядеть эта реализация. Знаете ли вы какой-нибудь пример кода, использующего это? К сожалению, я не могу изменить самое крупное приложение хоста. Я изменил свой первоначальный вопрос с помощью этой детали.

4. Но все же почему? Чем вы на самом деле хотите поделиться? Почему бы просто не построить 2 веб-сервера с отдельными сборками точек входа, работающими как отдельные процессы? С общими службами, перемещенными в общую сборку, от которой зависят оба приложения.