2016-08-17 2 views
11

Так скажем, у меня есть одноэлементный экземпляр класса, который я зарегистрировать в DI, как это:ASP.NET Ядро инициализирует одноплодное после настройки DI

services.AddSingleton<IFoo, Foo>(); 

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

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

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

+0

Вы можете создать 'new Foo() 'и зарегистрировать его в методе ConfigureServices. –

ответ

14

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

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

Или «подогреть»

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

или в качестве альтернативы

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

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

+3

Но тогда мне придется беспокоиться обо всех зависимостях Foo (все репозитории и их зависимости). Определенно выполнимо, но ищет способ, который не воюет с системой. – pbz

+0

Да. Обычно вы только инициализируете классы, которые нуждаются в специальном лечении, например, при запуске подключения к сервисной шине и т. Д., Которые вы не хотите выполнять во время загрузки. Нам нужна дополнительная информация, хотя именно вы пытаетесь. Я подозреваю, что вы выполняете какую-то длительную операцию в конструкторе, что абсолютно не нужно. Создание экземпляра класса должно выполняться быстро и долго, никогда не выполняться в конструкторе. Конечно, вы также можете разрешить класс в «Конфигурации» один раз, но это просто «грязно» – Tseng

+0

Да, относительно долго работает, потому что он отправляется в базу данных для извлечения данных (около 50 мс для нескольких запросов). Поскольку это одноэлемент, можно утверждать, что не имеет значения, где он инициализирован. Я думаю, что это лучший вариант до сих пор (кстати, вы ошибочно настроили Configure(). Просто попробовали, и он работает, чтобы добавить IFoo в список параметров для Configure(), поэтому мне не нужно вызывать GetService <>(). Спасибо. – pbz

Смежные вопросы