89 votes

Application console .NET Core, comment configurer appSettings par environnement ?

J'ai une application console .NET Core 1.0.0 et deux environnements. Je dois être en mesure d'utiliser appSettings.dev.json et appSettings.test.json en fonction des variables d'environnement que je définis au moment de l'exécution. Cela semble assez simple pour les applications web ASP.NET Core, grâce à l'injection de dépendances, à IHostingEnvironment et à la variable d'environnement EnvironmentName, mais comment dois-je organiser les choses pour l'application console (à part écrire mon propre code personnalisé qui utilise Microsoft.Framework.Configuration.EnvironmentVariables ) ?

Merci.

3voto

Merilix2 Points 31

À partir de Net Core 3.1++, la classe générique Host Microsoft.Extensions.Hosting.Host utilise la variable d'environnement DOTNET_ENVIRONMENT au lieu de ASPNETCORE_ENVIRONMENT.

Réglage de DOTNET_ENVIRONMENT="Development" dans les paramètres de débogage du projet fonctionnera sans aucun codage supplémentaire.

Ou vous pouvez ajouter votre propre préfixe comme ceci :

// works for WPF but should work similar for Console Apps
public partial class App : Application
{
    private readonly IHost _host;

    public App()
    {
        _host = Host.CreateDefaultBuilder()
            .ConfigureHostConfiguration(configHost => {
                configHost.AddEnvironmentVariables(prefix: "PREFIX_");
            })
            .ConfigureServices((context, services) =>
            {
                ConfigureServices(context.Configuration, services);
            })
            .Build();
    }

    private void ConfigureServices(
        IConfiguration configuration,
        IServiceCollection services)
    {
       // ...
    }

    // ...
}

2voto

lnaie Points 595

C'est quelque chose comme ça, pour une application console de base Dotnet 2.x :

        using Microsoft.Extensions.Configuration;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;

        [...]
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
        var serviceProvider = new ServiceCollection()
            .AddLogging(options => options.AddConfiguration(configuration).AddConsole())
            .AddSingleton<IConfiguration>(configuration)
            .AddSingleton<SomeService>()
            .BuildServiceProvider();
        [...]
        await serviceProvider.GetService<SomeService>().Start();

Vous pourriez injecter ILoggerFactory, IConfiguration dans l'environnement de l'utilisateur. SomeService .

0voto

Antony Booth Points 67

Vous pouvez le faire pour la variable d'environnement ASP.Net Core (ASPNETCORE_ENVIRONMENT) : -

using Microsoft.AspNetCore.Hosting;
using System;

public class Program {
    private static string HostingEnvironment => Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    private static bool IsEnvironment(string environmentName) => HostingEnvironment?.ToLower() == environmentName?.ToLower() && null != environmentName;

    private static bool Development => IsEnvironment(EnvironmentName.Development);
    private static bool Production => IsEnvironment(EnvironmentName.Production);
    private static bool Staging => IsEnvironment(EnvironmentName.Staging);

    public static void Main(string[] args) { // Your code here }
}

Vous pouvez alors simplement utiliser la propriété

    public static void Main(string[] args) {
        if (Development){
            // Blow up the planet
        }
    }

6 votes

La question ne portait pas sur asp.net core.

1 votes

Je sais, mais le uniquement Les éléments qui sont vaguement liés à asp.net core sont le nom de la variable d'environnement et la bibliothèque .net core utilisée pour obtenir les constantes de chaîne pour 'Development', 'Staging' et 'Production'. J'ai pensé qu'il serait utile d'utiliser une variable d'environnement légitime plutôt qu'une variable que j'ai inventée. Cela pourrait être n'importe quoi et ne pas être du tout dans une application asp.net core.

1 votes

Celui-ci (et ses frères et sœurs) est-il plus "NON asp.net (core)" ? docs.microsoft.com/fr/us/dotnet/api/

0voto

Adam Hardy Points 18

Pour tous ceux qui utilisent .NetCore 3.1 et l'extension .CreateDefaultBuilder(args). Ajoutez simplement -environnement "Development" à vos arguments de ligne de commande dans les paramètres de débogage. C'est fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X