Configuration ASP.NET Core pour l'application console .NET Core

135

ASP.NET Core prend en charge un nouveau système de configuration comme indiqué ici: https://docs.asp.net/en/latest/fundamentals/configuration.html

Ce modèle est-il également pris en charge dans les applications de la console .NET Core?

Sinon, qu'est-ce qui est alternatif au précédent app.configet au ConfigurationManagermodèle?

kimsagro
la source

Réponses:

76

Vous pouvez utiliser cet extrait de code. Il comprend la configuration et la DI.

public class Program
{
    public static ILoggerFactory LoggerFactory;
    public static IConfigurationRoot Configuration;

    public static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;

        string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        if (String.IsNullOrWhiteSpace(environment))
            throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");

        Console.WriteLine("Environment: {0}", environment);

        var services = new ServiceCollection();

        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(AppContext.BaseDirectory))
            .AddJsonFile("appsettings.json", optional: true);
        if (environment == "Development")
        {

            builder
                .AddJsonFile(
                    Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
                    optional: true
                );
        }
        else
        {
            builder
                .AddJsonFile($"appsettings.{environment}.json", optional: false);
        }

        Configuration = builder.Build();

        LoggerFactory = new LoggerFactory()
            .AddConsole(Configuration.GetSection("Logging"))
            .AddDebug();

        services
            .AddEntityFrameworkNpgsql()
            .AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);

        services.AddTransient<IPackageFileService, PackageFileServiceImpl>();

        var serviceProvider = services.BuildServiceProvider();

        var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();

        ............
    }
}

Oh, et n'oubliez pas d'ajouter dans le project.json

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
      "includeFiles": [
        "appsettings.json",
        "appsettings.Integration.json",
        "appsettings.Production.json",
        "appsettings.Staging.json"
      ]
    }
  },

  "publishOptions": {
    "copyToOutput": [
      "appsettings.json",
      "appsettings.Integration.json",
      "appsettings.Production.json",
      "appsettings.Staging.json"
    ]
  },
...
}
aligin
la source
12
Cette réponse n'est pas idéale. Utilisez à la Directory.GetCurrentDirectory()place de AppContext.BaseDirectory. Il ne devrait pas y avoir besoin de hack par la suite.
Matyas
1
Ou définissez la propriété «Copier dans le répertoire de sortie» sur «Copier si plus récent» dans Visual Studio pour les fichiers JSON.
BuddhiP
Pour que le répertoire de base fonctionne dans Web, Console et Winforms, vous pouvez utiliser cette approche stackoverflow.com/a/33675039/1818723
Pawel Cioch
Gary Woodfine a décrit cela en détail dans un très bon style sur ce post: garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi
@javad Seulement en partie; Je me suis retrouvé ici parce que je voulais la partie DI, ce qu'il a promis mais je n'ai pas trouvé. Il n'a pas non plus montré comment utiliser plusieurs fichiers de configuration comme le fait cet exemple.
Auspex
232

Pour une application console .NET Core 2.0, j'ai effectué les opérations suivantes:

  1. Créez un nouveau fichier nommé appsettings.json à la racine du projet (le nom du fichier peut être n'importe quoi)
  2. Ajoutez mes paramètres spécifiques à ce fichier en tant que json. Par exemple:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Configurer pour copier le fichier dans le répertoire de sortie chaque fois que le projet est construit (dans VS -> Explorateur de solutions -> cliquez avec le bouton droit sur le fichier -> sélectionnez 'Propriétés' -> Avancé -> Copier dans le répertoire de sortie -> sélectionnez 'Copier toujours')

  2. Installez le package nuget suivant dans mon projet:

    • Microsoft.Extensions.Configuration.Json
  3. Ajoutez ce qui suit à Program.cs (ou à Main()son emplacement):

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. Ensuite, lisez les valeurs de l'une des manières suivantes:

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);

Plus d'informations: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration

Rayon
la source
1
Comme je l'ai remarqué, Microsoft n'utilise pas IConfigurationRoot dans ses exemples, mais utilise IConfiguration.
aligin
3
IConfigurationRootest toujours disponible dans .NET Core 2.0 . Il hérite de, IConfigurationmais il est considéré comme un cas dérivé qui n'est pas couramment utilisé . Quoi qu'il en soit, l'exemple de code a été mis à jour pour ne pas l'inclure et éviter toute confusion.
Ray
10
2 remarques: sur le point 4, vous n'avez besoin que de Microsoft.Extensions.Configuration.Json ... Il inclura les 2 autres par défaut. Deuxièmement: si vous voulez charger une section dans un objet, il est utile de savoir: var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ("toto"), options); Vous aurez besoin de Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai
1
classe publique FooOptions {chaîne publique myKey1 {get; set;} chaîne publique myKey2 {get; set;}}
Yepeekai
2
Tools> NuGet Package Manager> Package Manager Console .. .. Install-Package Microsoft.Extensions.Configuration .. Install-Package Microsoft.Extensions.Configuration.FileExtensions .. Install-Package Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy
19

Si vous utilisez Microsoft.Extensions.Hosting(version 2.1.0+) pour héberger votre application console et votre application principale asp.net, toutes vos configurations sont injectées avec HostBuilderdes méthodes ConfigureAppConfigurationet ConfigureHostConfiguration. Voici la démonstration sur la façon d'ajouter les appsettings.jsonvariables d'environnement et:

    var hostBuilder = new HostBuilder()
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                // enviroment from command line
                // e.g.: dotnet run --environment "Staging"
                config.AddCommandLine(args);
            }
        })
        .ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            // Override config by env, using like Logging:Level or Logging__Level
            .AddEnvironmentVariables();

        })
        ... // add others, logging, services
        //;

Afin de compiler le code ci-dessus, vous devez ajouter ces packages:

<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />
Feiyu Zhou
la source
Comment l'environnement est-il déterminé? Si je crée un profil dans launchSettings, il définit en fait ASPNETCORE_ENVIRONMENTmais context.HostingEnvironment.EnvironmentNamen'est pas correctement défini
Sinaesthetic
Vous devez utiliser l'environnement comme clé, vérifiez ce code: github.com/aspnet/Hosting/blob/dev/src/…
Feiyu Zhou
@FeiyuZhou c'est un lien mort
Auspex
Est-ce que toute cette solution n'est pas new HostBuilder()redondante après ? Ne HostBuilderfait-il pas tout en interne?
Auspex
@Auspex Cela dépend de la façon dont vous définissez votre application console. Si vous avez besoin de définir des configurations personnalisées, vous devez définir comme ceci. Voici la documentation pour dotnet core 3.0: docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
Feiyu Zhou
10

Je me trompais. Vous pouvez utiliser le nouveau à ConfigurationBuilderpartir d'une application console netcore.

Voir https://docs.asp.net/en/latest/fundamentals/configuration.html pour un exemple.

Cependant, seul aspnet core a une injection de dépendances prête à l'emploi, vous n'avez donc pas la possibilité d'avoir des paramètres de configuration fortement typés et de les injecter automatiquement à l'aide de IOptions.

kimsagro
la source
9
Cette réponse est valide, mais elle doit contenir le code nécessaire, donc pas de vote positif.
Matyas
4
Tout ce dont vous avez besoin est d'ajouter un package: Microsoft.Extensions.Optionset d'appelerservice.AddOptions();
Bruno Garcia
2
L'ensemble de la page liée (très longue) semble être liée à ASP.NET, avec la mention "WebHost" dans chaque exemple. Je suis arrivé à cette question SO après avoir trouvé la page liée et avoir pensé "ok, c'est ASP.NET, qu'en est-il des applications console".
mackenir
C'est un peu étrange, @mackenir, car dans la version 3.0, tout a été refactorisé pour que ce ne soit que Host! La seule référence à WebHost lui-même est de vous diriger vers la documentation 2.2. Il aurait pu être un peu plus clair que les ConfigureWebHostDefaults()appels dans les exemples sont facultatifs et uniquement pour les applications Web.
Auspex
4

C'est quelque chose comme ça, pour une application de 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 pouvez injecter ILoggerFactory, IConfiguration dans le fichier SomeService.

Lnaie
la source
2

Sur .Net Core 3.1, nous devons simplement faire ceci:

static void Main(string[] args)
{
  var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}

L'utilisation de SeriLog ressemblera à:

using Microsoft.Extensions.Configuration;
using Serilog;
using System;


namespace yournamespace
{
    class Program
    {

        static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();

            try
            {
                Log.Information("Starting Program.");
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Program terminated unexpectedly.");
                return;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

Et la section Serilog appsetings.json pour générer un fichier quotidiennement ressemblera à ceci:

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Logs\\Program.json",
          "rollingInterval": "Day",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }
Ernest
la source
après avoir essayé toutes ces syntaxes de partout sur le Web, la vôtre est celle qui a fonctionné pour moi, et c'est si simple.
GaneshT le
Je suis content que cela vous ait aidé.
Ernest
1

Vous pouvez utiliser la bibliothèque LiteWare.Configuration pour cela. Il est très similaire à .NET Framework original ConfigurationManageret fonctionne pour .NET Core / Standard. Au niveau du code, vous vous retrouverez avec quelque chose comme:

string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");

Avis de non-responsabilité: Je suis l'auteur de LiteWare.Configuration.

Hisham Maudarbocus
la source
0

Je m'empile juste ... semblable au message de Feiyu Zhou. Ici, j'ajoute le nom de la machine.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
          .ConfigureAppConfiguration((context, builder) =>
          {
            var env = context.HostingEnvironment;
            var hostname = Environment.MachineName;
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
              .AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
            builder.AddEnvironmentVariables();
            if (args != null)
            {
              builder.AddCommandLine(args);
            }
          })
        .UseStartup<Startup>();
  }
bvj
la source
0

Installez ces packages:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

Code:

static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
        Console.WriteLine("ENVIRONMENT: " + environmentName);

        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", false)
           .AddJsonFile($"appsettings.{environmentName}.json", true)
           .AddEnvironmentVariables();

        IConfigurationRoot configuration = builder.Build();
        var mySettingsConfig = configuration.Get<MySettingsConfig>();

        Console.WriteLine("URL: " + mySettingsConfig.Url);
        Console.WriteLine("NAME: " + mySettingsConfig.Name);

        Console.ReadKey();
    }

Classe MySettingsConfig:

public class MySettingsConfig
{
    public string Url { get; set; }
    public string Name { get; set; }
}

Vos paramètres d'application peuvent être aussi simples que ceci: entrez la description de l'image ici

En outre, définissez les fichiers de paramètres d'applications sur Contenu / Copie s'ils sont plus récents: contenu

alansiqueira27
la source