web-dev-qa-db-fra.com

Comment lire les paramètres de configuration avant d'initialiser un hôte dans ASP .NET Core?

Avant d'initialiser l'hôte d'application, je dois lire certains paramètres de la configuration de l'application pour configurer d'autres choses.

Dans ASP .NET Core 2.x pour lire les paramètres avant d'initialiser l'hôte d'application, j'avais l'habitude de faire ce qui suit:

public static void Main(string[] args)
{
    //...

    var configuration = new ConfigurationBuilder()
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json")
        .Build();

    //Do something useful with the configuration...

    var Host = WebHost.CreateDefaultBuilder()
        .UseStartup<Startup>()
        .UseConfiguration(configuration)
        .Build();

    //...
}

In ASP .NET Core 3.x WebHosta été déconseillé en faveur de l'hôte générique .NET .
. NET Generic Host n'a que .ConfigureHostConfiguration() et .ConfigureAppConfiguration() qui ne prennent pas une configuration construite comme paramètre, mais acceptent uniquement un délégué utilisé pour configurer la configuration.

Pour les charges de travail HTTP, vous pouvez toujours utiliser la méthode .UseConfiguration() si elle est exposée par IWebHostBuilder et faire essentiellement la même chose qu'avant:

public static void Main(string[] args)
{
    //...

    var configuration = new ConfigurationBuilder()
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json")
        .Build();

    //Do something useful with the configuration...

    var Host = Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
                .UseConfiguration(configuration);
        })
        .Build();

    //...
}

Mais cela ne fonctionne que pour les charges de travail HTTP et non pour Worker Services.

Pour obtenir la configuration avant de configurer l'hôte, j'ai proposé l'approche suivante:

public static void Main(string[] args)
{
    //...

    var configuration = ConfigureConfigurationBuilder(args)
        .Build();

    //Do something useful with the configuration...

    var Host = Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder => ConfigureConfigurationBuilder(args, builder))
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .Build();

    //...
}

public static IConfigurationBuilder ConfigureConfigurationBuilder(string[] args, IConfigurationBuilder configurationBuilder = null)
{
    configurationBuilder ??= new ConfigurationBuilder();

    configurationBuilder
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json");

    return configurationBuilder;
}

Essentiellement, j'ai écrit une méthode qui installe un ConfigurationBuilder et le renvoie, afin que je puisse réutiliser la même configuration. Cela fonctionne dans la pratique, mais je construis deux fois la même configuration.

Existe-t-il un moyen plus simple/plus correct (qui fonctionne pour les charges de travail HTTP et non HTTP) de créer et de réutiliser la configuration avant d'installer l'hôte?

5
Gwinn

La bonne question, avez-vous vraiment besoin d'une configuration pour votre configuration? vous pouvez utiliser un autre fichier et le lier directement avec l'entité

configuration.GetSection("entity").Bind(entity);

Si je ne comprenais pas ce que vous voulez dire, tout ce que je sais, c'est que la configuration dont vous aurez besoin pour l'injection de dépendances, ou que vous ne pouvez pas l'utiliser, donc au lieu d'utiliser cela, vous pouvez utiliser des extensions pour votre collection de services pour faire ce que vous voulez avec votre configuration, et vous obtenez la configuration dans votre conteneur

0
ousspero