Konfigurasi ASP.NET Core untuk aplikasi konsol .NET Core


Jawaban:


76

Anda dapat menggunakan potongan kode ini. Ini termasuk Konfigurasi dan 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, dan jangan lupa menambahkan di 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"
    ]
  },
...
}

12
Jawaban ini tidak ideal. Gunakan Directory.GetCurrentDirectory()sebagai ganti AppContext.BaseDirectory. Seharusnya tidak perlu melakukan hacking sesudahnya.
Matyas

1
Atau setel properti "Salin ke Keluaran Direktori" ke "Salin jika lebih baru" di Visual Studio untuk file JSON.
BuddhiP

Agar dir dasar berfungsi di Web, Konsol, dan Winform, Anda dapat menggunakan pendekatan ini stackoverflow.com/a/33675039/1818723
Pawel Cioch

Gary Woodfine menggambarkan ini secara rinci dalam gaya yang sangat baik pada posting ini: garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi

@javad Hanya sebagian; Saya berakhir di sini karena saya menginginkan bagian DI, yang dijanjikannya tetapi saya belum menemukannya. Dia juga tidak menunjukkan cara menggunakan banyak file konfigurasi seperti contoh ini.
Auspex

232

Untuk aplikasi konsol .NET Core 2.0, saya melakukan hal berikut:

  1. Buat file baru bernama appsettings.json di root proyek (nama file bisa apa saja)
  2. Tambahkan pengaturan spesifik saya ke file itu sebagai json. Sebagai contoh:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Mengkonfigurasi untuk menyalin file ke direktori output setiap kali proyek dibangun (dalam VS -> Solution Explorer -> file klik kanan -> pilih 'Properties' -> Advanced -> Salin ke Direktori Output -> pilih 'Salin Selalu')

  2. Instal paket nuget berikut di proyek saya:

    • Microsoft.Extensions.Configuration.Json
  3. Tambahkan berikut ini ke Program.cs (atau di mana pun Main()berada):

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. Kemudian baca nilai menggunakan salah satu dari cara berikut:

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

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


1
Seperti yang saya perhatikan Microsoft tidak menggunakan IConfigurationRoot dalam contoh mereka, tetapi gunakan IConfiguration.
aligin

3
IConfigurationRootmasih tersedia di .NET Core 2.0 . Itu mewarisi dari IConfigurationtetapi itu dianggap kasus turunan dari itu yang tidak umum digunakan . Apapun, contoh kode telah diperbarui untuk tidak memasukkannya dan menghindari kebingungan.
Ray

10
2 catatan: pada poin 4, Anda hanya perlu Microsoft.Extensions.Configuration.Json ... Ini akan mencakup 2 lainnya secara default. Kedua: Jika Anda ingin memuat bagian ke objek, ada baiknya untuk mengetahui: var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ("foo"), opsi); Anda akan memerlukan Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
FooOptions kelas publik {public string myKey1 {get; set;} public string myKey2 {get; set;}}
Yepeekai

2
Perkakas> NuGet Package Manager> Package Manager Console .. .. Instal-Paket Microsoft.Extensions.Configuration .. Instal-Package Microsoft.Extensions.Configuration.FileExtensions .. Instal-Paket Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

Jika Anda menggunakan Microsoft.Extensions.Hosting(versi 2.1.0+) untuk menjadi tuan rumah aplikasi inti aplikasi konsol dan asp.net Anda, semua konfigurasi Anda yang disuntikkan dengan HostBuilder's ConfigureAppConfigurationdan ConfigureHostConfigurationmetode. Berikut ini demo tentang cara menambahkan appsettings.jsonvariabel dan lingkungan:

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

Untuk mengkompilasi kode di atas, Anda perlu menambahkan paket-paket ini:

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

Bagaimana lingkungan ditentukan? Jika saya membuat profil di launchSettings, itu benar-benar ditetapkan ASPNETCORE_ENVIRONMENTtetapi kemudian context.HostingEnvironment.EnvironmentNametidak diatur dengan benar
Sinaesthetic

Anda harus menggunakan lingkungan sebagai kuncinya, periksa kode ini: github.com/aspnet/Hosting/blob/dev/src/…
Feiyu Zhou

@FeiyuZhou itu tautan mati
Auspex

Bukankah semua solusi ini setelah new HostBuilder()mubazir? Tidak HostBuildermelakukan semuanya secara internal?
Auspex

@Auspex Tergantung pada bagaimana Anda mendefinisikan aplikasi konsol Anda. Jika Anda perlu mendefinisikan konfigurasi khusus maka Anda harus mengatur seperti ini. Inilah dokumen untuk dotnet core 3.0: docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
Feiyu Zhou

10

Saya salah. Anda dapat menggunakan yang baru ConfigurationBuilderdari aplikasi konsol netcore.

Lihat https://docs.asp.net/en/latest/fundamentals/configuration.html untuk contoh.

Namun, hanya inti aspnet yang memiliki injeksi dependen di luar kotak sehingga Anda tidak memiliki kemampuan untuk memiliki pengaturan konfigurasi yang sangat diketik dan secara otomatis menyuntikkannya menggunakan IOptions.


9
Jawaban ini valid, tetapi harus berisi kode yang diperlukan, sehingga tidak ada suara positif.
Matyas

4
Yang Anda butuhkan adalah menambahkan paket: Microsoft.Extensions.Optionsdan meneleponservice.AddOptions();
Bruno Garcia

2
Seluruh halaman tertaut (sangat panjang) tampaknya terkait dengan ASP.NET, dengan menyebutkan "WebHost" dalam setiap contoh. Saya sampai pada pertanyaan SO ini setelah menemukan halaman yang ditautkan dan berpikir "ok, itu ASP.NET, bagaimana dengan Aplikasi Konsol".
mackenir

Itu agak aneh, @mackenir, karena pada 3.0 semuanya telah di refactored sehingga semuanya hanya Host! Satu-satunya referensi ke WebHost itu sendiri adalah mengarahkan Anda ke dokumentasi 2.2. Mereka bisa sedikit lebih jelas bahwa ConfigureWebHostDefaults()panggilan dalam contoh adalah opsional, dan hanya untuk aplikasi Web.
Auspex

4

Ini sesuatu seperti ini, untuk aplikasi konsol dotnet 2.x core:

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

Anda dapat menyuntikkan ILoggerFactory, IConfiguration di SomeService.


2

Pada .Net Core 3.1 kita hanya perlu melakukan ini:

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

Menggunakan SeriLog akan terlihat seperti:

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

Dan bagian Serilog appsetings.json untuk menghasilkan satu file setiap hari akan terlihat seperti:

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

setelah mencoba semua sintaks dari seluruh web, milik Anda adalah yang bekerja untuk saya, dan itu sangat sederhana.
GaneshT

Saya senang itu membantu Anda.
Ernest

1

Anda dapat menggunakan pustaka LiteWare.Configuration untuk itu. Ini sangat mirip dengan .NET Framework orisinil ConfigurationManagerdan berfungsi untuk .NET Core / Standard. Dari segi kode, Anda akan berakhir dengan sesuatu seperti:

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

Penafian: Saya adalah penulis LiteWare.Configuration.


0

Hanya menumpuk ... mirip dengan pos Feiyu Zhou. Di sini saya menambahkan nama mesin.

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

Instal paket-paket ini:

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

Kode:

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

Kelas MySettingsConfig:

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

Pengaturan aplikasi Anda dapat sesederhana ini: masukkan deskripsi gambar di sini

Juga, atur file pengaturan aplikasi ke Konten / Salin jika lebih baru: kandungan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.