Ядро 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)
{
...
}
Но это кажется грязным, и это больше проблема с вашим дизайном, если вы делаете то, что не должно быть в конструкторе. Создание экземпляра класса должно быть быстрым, и если вы выполняете длительные операции внутри него, вы нарушаете кучу лучших практик и должны реорганизовать свою базу кода, а не искать способы взломать ее