Я следовал этому руководству https://simpleinjector.org/aspnetcore, чтобы настроить и запустить базовое приложение. И это прекрасно работает.
Однако сейчас мои потребности немного другие. Веб-API в моем приложении — это, по сути, необязательная конечная точка, которую нельзя запустить. Однако я хочу использовать Simple Injector для DI во всем приложении.
В моем Program.cs у меня есть следующие строки:
// REST API
if (Config.ReadSettingBool("StartRestEndpoint", false))
{
LogManager.Info("Starting REST Endpoint...");
try
{
_httpHost = new HttpHost(
Config.ReadSetting("HttpHost", "localhost"),
Config.ReadSetting("HttpPort", 8081),
Config.ReadSetting("RestEnvironment", "Development"));
_httpHost.Start();
LogManager.Info("REST Endpoint started");
}
catch (Exception e)
{
LogManager.Error($"Failed to start REST endpoint: {e}");
}
}
Теперь внутри HttpHost происходит следующее:
_webHost = WebHost.CreateDefaultBuilder()
.UseUrls()
.UseUrls(_url)
.UseStartup<Startup>()
.UseEnvironment(_environment)
.Build();
_webHost.Start();
а внутри автозапуска тот же код, который я связал.
Моя проблема в том, что контейнер SimpleInjector хранится (и настраивается) внутри StartUp, и у меня нет возможности добраться до него. Что я действительно хочу, так это настроить все дерево зависимостей, не связанное с ядром aspnet, до выполнения процедуры StartUp и интеграции с ядром aspnet.
То есть часть «добавить прикладные службы» в приведенном ниже отрывке:
private void InitializeContainer(IApplicationBuilder app) {
// Add application presentation components:
container.RegisterMvcControllers(app);
container.RegisterMvcViewComponents(app);
// Add application services. For instance:
container.Register<IUserService, UserService>(Lifestyle.Scoped);
// Allow Simple Injector to resolve services from ASP.NET Core.
container.AutoCrossWireAspNetComponents(app);
}
Причина этого в том, что это приложение не является чистым веб-API, сосредоточенным вокруг Http. Это устаревшее приложение, содержащее множество фоновых потоков, выполняющих отдельную работу, не все из которых должны каким-то образом отображаться в веб-API. В некоторых средах веб-API даже не следует запускать. Вы можете возразить, что приложение должно быть каким-то образом разделено, но, учитывая ограничения, которые у меня есть, это просто не вариант.
Вкратце: это решает мою цель — использовать один и тот же DI-контейнер, полагаться на одни и те же сервисы, постоянный доступ и многое другое во всем приложении, при этом мои ресурсы REST могут использовать части функциональности устаревшего приложения.
Возможно ли это, и как я могу это сделать? Или я использую эти инструменты «не так»?