#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 веб-сервера с отдельными сборками точек входа, работающими как отдельные процессы? С общими службами, перемещенными в общую сборку, от которой зависят оба приложения.