Я бы подключился к методу ConfigureContainer HostBuilder и установил туда simpleinjectore, например:
HostBuilder()
.ConfigureContainer<ServiceCollection>((builder, services) =>
{
var container = new Container();
container.RegisterSingleton<IJobRepository, JobRepository>();
services.AddTransient<IHostedService, TimedService>();
})
.ConfigureServices((hostContext, services) =>
{
// Originally we would have done this
//services.AddHostedService<Service>();
})
.Build();
using (host)
{
await host.StartAsync();
await host.WaitForShutdownAsync();
}
Хотя вы действительно можете использовать реализацию IHostedService, я думаю, что она может скрыть то, что происходит.Я считаю, что начальную загрузку инфраструктуры следует проводить в одном месте или организовывать хотя бы в одном месте.Я считаю, что контейнер является инфраструктурой, и настроил бы все это вместе с остальным приложением с помощью методов HostBuilder.
Дополнительным преимуществом также может быть то, что вы не полностью заменяете ServiceCollection, поскольку он хорошо работает при выполнениидругие вещи, связанные с рамками.Пример некоторых вещей, которые я все еще делал бы с ServiceCollection:
HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
services.AddOptions();
})
Это соответствует тому, что указано в документах simpleinjector о настройке контейнера с помощью ASP.NET Core:
Практика использования Simple Injector - это использование Simple Injector для построения графов объектов ваших компонентов приложения и предоставление встроенной инфраструктуры построения контейнеров и сторонних компонентов. Практика использования Simple Injector заключается в использовании Simple Injector для созданиясоздайте графы объектов для компонентов вашего приложения и позвольте встроенной структуре сборки контейнера и сторонним компонентам
То же самое должно применяться только к ядру .net и универсальному HostBuilder.