web-dev-qa-db-fra.com

Code de démarrage d'application dans ASP.NET Core

En lisant la documentation pour ASP.NET Core , il existe deux méthodes choisies pour le démarrage: Configure et ConfigureServices.

Aucun de ceux-ci ne semblait être un bon endroit pour mettre du code personnalisé que j'aimerais exécuter au démarrage. Peut-être que je veux ajouter un champ personnalisé à ma base de données s'il n'existe pas, rechercher un fichier spécifique, semer des données dans ma base de données, etc. Code que je veux exécuter une fois, juste au démarrage de l'application.

Existe-t-il une approche préférée/recommandée pour y parvenir?

30
Kyle Ballard

Fondamentalement, il existe deux points d'entrée pour un tel code personnalisé au moment du démarrage.

1.) Main méthode

Comme une application ASP.NET Core a la bonne vieille méthode Main comme point d'entrée, vous pouvez placer du code avant le démarrage d'ASP.NET Core, comme

public class Program
{
    public static void Main(string[] args)
    {
        // call custom startup logic here
        AppInitializer.Startup();

        var Host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        Host.Run();
    }
}

2.) Utilisez votre classe Startup

Comme vous l'avez déjà dit dans votre question, le Configure et ConfigureServices est un bon endroit pour votre code personnalisé.

Je préférerais la classe Startup. Du point de vue de l'exécution, peu importe que l'appel soit appelé au démarrage ou ailleurs avant l'appel Host.Run(). Mais du point de vue d'un programmeur qui est habitué au framework ASP.NET, son premier look pour une telle logique serait le fichier Startup.cs. Tous les exemples et modèles contiennent la logique pour l'initialisation de l'identité, de l'entité Framework, etc. Donc, en tant que convention, je recommande de placer les éléments d'initialisation là-bas.

10
Ralf Bönning

Je suis d'accord avec l'OP.

Mon scénario est que je souhaite enregistrer un microservice auprès d'un registre de services mais que je n'ai aucun moyen de savoir quel est le point de terminaison tant que le microservice n'est pas en cours d'exécution.

Je pense que les méthodes Configure et ConfigureServices ne sont pas idéales car aucune n'a été conçue pour effectuer ce type de traitement.

Un autre scénario serait de vouloir réchauffer les caches, ce qui est encore une chose que nous pourrions vouloir faire.

Il existe plusieurs alternatives à la réponse acceptée:

  • Créez une autre application qui effectue les mises à jour en dehors de votre site Web, comme un outil de déploiement, qui applique les mises à jour de la base de données par programme avant de démarrer le site Web

  • Dans votre classe de démarrage, utilisez un constructeur statique pour vous assurer que le site Web est prêt à démarrer

Mise à jour

La meilleure chose à faire à mon avis est d'utiliser l'interface IApplicationLifetime comme ceci:

public class Startup
{
    public void Configure(IApplicationLifetime lifetime)
    {
        lifetime.ApplicationStarted.Register(OnApplicationStarted);
    }

    public void OnApplicationStarted()
    {
        // Carry out your initialisation.
    }
}
17
Matthew Bonner