Я следовал этому руководству https://simpleinjector.org/aspnetcore для настройки и запуска базового приложения. И это прекрасно работает.
Однако мои потребности сейчас немного другие. Веб-API в моем приложении - это необязательная конечная точка, которая может не запускаться. Однако я хочу использовать Simple Injector for 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 хранится (и настраивается) внутри автозагрузки, и у меня нет способа добраться до него. Что я действительно хочу, так это настроить все дерево зависимостей, не связанных с 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);
}
Причина, по которой вы этого хотите, заключается в том, что это приложение не является чистым веб-интерфейсом, сконцентрированным вокруг Http. Это унаследованное приложение, содержащее множество фоновых потоков, выполняющих отдельную работу, не все из которых должны каким-либо образом отображаться в веб-API. В некоторых средах веб-API даже не должен запускаться. Вы можете утверждать, что приложение должно быть как-то разделено, но, учитывая мои ограничения, это просто не вариант.
Вкратце: это решает мою цель: использовать один и тот же DI-контейнер, полагаясь на одни и те же сервисы, постоянный доступ и многое другое во всем приложении, поскольку мои ресурсы REST могут использовать части функциональности унаследованного приложения.
Возможно ли это, и как я могу это сделать? Или я использую эти инструменты "неправильный путь"?