web-dev-qa-db-fra.com

ASP.NET Core initialise singleton après avoir configuré DI

Disons donc que j'ai une instance de classe singleton que j'enregistre dans la DI comme ceci:

services.AddSingleton<IFoo, Foo>();

Et disons que la classe Foo a un certain nombre d'autres dépendances (principalement des classes de référentiel qui lui permettent de charger des données).

Avec ma compréhension actuelle, l'instance de Foo n'est pas créée jusqu'à ce qu'elle soit utilisée pour la première fois (demandé). Existe-t-il un moyen d'initialiser cette classe autre que le constructeur? Comme juste après la fin de ConfigureServices()? Ou le code d'initialisation (chargement des données à partir de db) doit-il être fait dans le constructeur de Foo?

(Ce serait bien si cette classe pouvait charger ses données avant la première utilisation pour accélérer le premier accès)

23
pbz

Faites-le vous-même lors du démarrage.

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

Ou "réchauffer"

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

ou bien

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

Mais cela semble juste sale et est plus un problème avec votre conception, si vous faites quelque chose que vous ne devriez pas faire dans le constructeur. L'instanciation de classe doit être rapide et si vous effectuez des opérations de longue durée, vous vous brisez contre un tas de meilleures pratiques et devez refactoriser votre base de code plutôt que de chercher des moyens de le pirater.

42
Tseng