ASP.NET Core-Konfiguration für .NET Core-Konsolenanwendung


Antworten:


76

Sie können dieses Code-Snippet verwenden. Es enthält Konfiguration und 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, und vergessen Sie nicht, in project.json hinzuzufügen

{
  "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"
    ]
  },
...
}

12
Diese Antwort ist nicht ideal. Verwenden Sie Directory.GetCurrentDirectory()anstelle von AppContext.BaseDirectory. Der Hack sollte danach nicht mehr benötigt werden.
— Matyas

1
Oder setzen Sie die Eigenschaft "In Ausgabeverzeichnis kopieren" in Visual Studio für die JSON-Dateien auf "Wenn neuer kopieren".
— BuddhiP

Damit das Basisverzeichnis in Web, Console und Winforms funktioniert, können Sie diesen Ansatz verwenden. Stackoverflow.com/a/33675039/1818723
— Pawel Cioch

Gary Woodfine beschrieb dies ausführlich in einem sehr guten Stil in diesem Beitrag: garywoodfine.com/configuration-api-net-core-console-application
— Javad Norouzi

@javad Nur teilweise; Ich bin hier gelandet, weil ich den DI-Teil wollte, den er versprochen hat, aber ich habe ihn nicht gefunden. Er hat auch nicht gezeigt, wie mehrere Konfigurationsdateien verwendet werden, wie in diesem Beispiel.
— Auspex

230

Für eine .NET Core 2.0-Konsolen-App habe ich Folgendes getan:

  1. Erstellen Sie eine neue Datei mit dem Namen appsettings.json im Stammverzeichnis des Projekts (der Dateiname kann beliebig sein).
  2. Fügen Sie dieser Datei meine spezifischen Einstellungen als json hinzu. Beispielsweise:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Konfigurieren Sie das Kopieren der Datei in das Ausgabeverzeichnis, wenn das Projekt erstellt wird (in VS -> Projektmappen- Explorer -> Rechtsklick auf Datei -> Wählen Sie 'Eigenschaften' -> Erweitert -> In Ausgabeverzeichnis kopieren -> Wählen Sie 'Immer kopieren').

  2. Installieren Sie das folgende Nuget-Paket in meinem Projekt:

    • Microsoft.Extensions.Configuration.Json
  3. Fügen Sie Program.cs (oder wo immer Main()es sich befindet) Folgendes hinzu :

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. Lesen Sie dann die Werte auf eine der folgenden Arten:

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

Weitere Informationen: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
Wie ich bemerkt habe, verwendet Microsoft in den Beispielen nicht IConfigurationRoot, sondern IConfiguration.
— Aligin

3
IConfigurationRootist weiterhin in .NET Core 2.0 verfügbar . Es erbt von, IConfigurationaber es wird als abgeleiteter Fall davon angesehen, der nicht häufig verwendet wird . Unabhängig davon wurde das Codebeispiel aktualisiert, um es nicht einzuschließen und Verwirrung zu vermeiden.
— Ray

10
2 Anmerkungen: In Punkt 4 benötigen Sie nur Microsoft.Extensions.Configuration.Json ... Die anderen 2 sind standardmäßig enthalten. Zweitens: Wenn Sie einen Abschnitt in ein Objekt laden möchten, ist es hilfreich zu wissen: var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ("foo"), Optionen); Sie benötigen Microsoft.Extensions.Options.ConfigurationExtensions
— Yepeekai

1
öffentliche Klasse FooOptions {public string myKey1 {get; set;} public string myKey2 {get; set;}}
— Yepeekai

2
Tools> NuGet Package Manager> Package Manager-Konsole .. .. Installationspaket Microsoft.Extensions.Configuration .. Installationspaket Microsoft.Extensions.Configuration.FileExtensions ..
— Installationspaket

19

Wenn Sie Microsoft.Extensions.Hosting(Konsole 2.1.0+) zum Hosten Ihrer Konsolen-App und der asp.net-Kern-App verwenden, werden alle Ihre Konfigurationen mit HostBuilder's ConfigureAppConfigurationund ConfigureHostConfigurationMethoden versehen. Hier ist die Demo zum Hinzufügen der appsettings.jsonVariablen und um:

    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
        //;

Um den obigen Code zu kompilieren, müssen Sie folgende Pakete hinzufügen:

<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" />

Wie wird die Umgebung bestimmt? Wenn ich ein Profil in launchSettings erstelle, wird es tatsächlich festgelegt, ASPNETCORE_ENVIRONMENTaber dann context.HostingEnvironment.EnvironmentNamenicht richtig festgelegt
— Sinaesthetic

Sie sollten die Umgebung als Schlüssel verwenden. Überprüfen Sie diesen Code: github.com/aspnet/Hosting/blob/dev/src/…
— Feiyu Zhou

@FeiyuZhou, das ist ein toter Link
— Auspex

Ist nicht alle diese Lösung nach new HostBuilder()redundant? Macht das nicht HostBuilderalles intern?
— Auspex

@Auspex Es hängt davon ab, wie Sie Ihre Konsolen-App definieren. Wenn Sie benutzerdefinierte Konfigurationen definieren müssen, sollten Sie dies so einstellen. Hier ist das Dokument für Dotnet Core 3.0: docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
— Feiyu Zhou

10

Ich lag falsch. Sie können das Neue ConfigurationBuilderaus einer Netcore-Konsolenanwendung verwenden.

Ein Beispiel finden Sie unter https://docs.asp.net/en/latest/fundamentals/configuration.html .

Allerdings verfügt nur der Aspnet-Core über eine sofort einsatzbereite Abhängigkeitsinjektion, sodass Sie nicht in der Lage sind, stark typisierte Konfigurationseinstellungen zu verwenden und diese automatisch mit zu injizieren IOptions.


9
Diese Antwort ist gültig, sollte aber den erforderlichen Code enthalten, also keine Gegenstimme.
— Matyas

4
Alles was Sie brauchen, ist Paket hinzuzufügen: Microsoft.Extensions.Optionsund anrufenservice.AddOptions();
— Bruno Garcia

2
Die gesamte (sehr lange) verlinkte Seite scheint ASP.NET-bezogen zu sein, wobei in jedem Beispiel "WebHost" erwähnt wird. Ich kam zu dieser SO-Frage, nachdem ich die verlinkte Seite gefunden und gedacht hatte "OK, das ist ASP.NET, was ist mit Konsolen-Apps".
— Mackenir

Das ist ein bisschen seltsam, @mackenir, denn in 3.0 wurde alles überarbeitet, so dass alles nur Host ist! Der einzige Verweis auf WebHost selbst besteht darin, Sie auf die 2.2-Dokumentation zu verweisen. Es hätte etwas klarer sein können, dass die ConfigureWebHostDefaults()Aufrufe in den Beispielen optional sind und nur für Web-Apps.
— Auspex

4

Für eine Dotnet 2.x-Kernkonsolenanwendung ist dies ungefähr so:

        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();

Das könnten Sie ILoggerFactory, IConfiguration in die injizieren SomeService.


2

In .Net Core 3.1 müssen wir nur Folgendes tun:

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

Die Verwendung von SeriLog sieht folgendermaßen aus:

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();
            }
        }
    }
}

Der Abschnitt Serilog appsetings.json zum täglichen Generieren einer Datei sieht folgendermaßen aus:

  "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"
        }
      }
    ]
  }

Nachdem Sie all diese Syntax aus dem gesamten Web ausprobiert haben, hat Ihre Syntax für mich funktioniert, und sie ist so einfach.
— GaneshT

Ich bin froh, dass es dir geholfen hat.
— Ernest

1

Sie können dafür die LiteWare.Configuration- Bibliothek verwenden. Es ist dem Original von .NET Framework sehr ähnlich ConfigurationManagerund funktioniert für .NET Core / Standard. In Bezug auf den Code erhalten Sie am Ende Folgendes:

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

Haftungsausschluss: Ich bin der Autor von LiteWare.Configuration.


0

Einfach aufstapeln ... ähnlich wie bei Feiyu Zhous Post. Hier füge ich den Maschinennamen hinzu.

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>();
  }

0

Installieren Sie diese Pakete:

  • 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();
    }

MySettingsConfig Klasse:

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

Ihre Apps können so einfach sein: Geben Sie hier die Bildbeschreibung ein

Stellen Sie außerdem die Appsettings-Dateien auf Content / Copy ein, falls neu: Inhalt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.