Ядро ASP.NET Core инициализирует singleton после настройки DI

Итак, скажем, у меня есть экземпляр класса singleton, который я регистрирую в DI следующим образом:

services.AddSingleton<IFoo, Foo>();

И пусть говорят, что класс Foo имеет ряд других зависимостей (в основном классы репозитория, которые позволяют ему загружать данные).

С моим нынешним пониманием экземпляр Foo не создается до тех пор, пока он не будет использован (задан). Есть ли способ инициализировать этот класс, отличный от конструктора? Как сразу после завершения ConfigureServices()? Или должен ли код инициализации (загрузка данных из db) выполняться в Foo-конструкторе?

(Было бы неплохо, если бы этот класс мог загружать свои данные до первого использования, чтобы ускорить первый доступ)

Ответ 1

Сделайте это самостоятельно во время запуска.

var foo = new Foo();
services.AddSingleton<IFoo>(foo);

Или "разогрейте"

public void Configure(IApplicationBuilder app) 
{
    app.ApplicationServices.GetService<IFoo>();
}

или альтернативно

public void Configure(IApplicationBuilder app, IFoo foo) 
{
    ...
}

Но это кажется грязным, и это больше проблема с вашим дизайном, если вы делаете то, что не должно быть в конструкторе. Создание экземпляра класса должно быть быстрым, и если вы выполняете длительные операции внутри него, вы нарушаете кучу лучших практик и должны реорганизовать свою базу кода, а не искать способы взломать ее