การกำหนดค่า ASP.NET Core สำหรับแอปพลิเคชันคอนโซล. NET Core


135

ASP.NET Core รองรับระบบการกำหนดค่าใหม่ดังที่เห็นที่นี่: https://docs.asp.net/en/latest/fundamentals/configuration.html

รุ่นนี้รองรับแอปพลิเคชันคอนโซล. NET Core ด้วยหรือไม่

ถ้าไม่ใช่รุ่นก่อนหน้าapp.configและConfigurationManagerรุ่นอะไร

คำตอบ:


76

คุณสามารถใช้ข้อมูลโค้ดนี้ ประกอบด้วย Configuration และ 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>();

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

อ้อและอย่าลืมเพิ่มใน 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
คำตอบนี้ไม่เหมาะอย่างยิ่ง ใช้Directory.GetCurrentDirectory()แทนAppContext.BaseDirectory. ไม่ควรมีความจำเป็นในการแฮ็คในภายหลัง
Matyas

1
หรือตั้งค่าคุณสมบัติ "Copy to Output Directory" เป็น "Copy if newer" ใน Visual Studio สำหรับไฟล์ JSON
BuddhiP

เพื่อให้ Base dir ทำงานในเว็บคอนโซลและ Winforms คุณสามารถใช้วิธีนี้ได้stackoverflow.com/a/33675039/1818723
Pawel Cioch

Gary Woodfine อธิบายรายละเอียดในรูปแบบที่ดีมากในโพสต์นี้: garywoodfine.com/configuration-api-net-core-console-application
Javad

@javad บางส่วนเท่านั้น; ฉันมาที่นี่เพราะฉันต้องการส่วน DI ซึ่งเขาสัญญาไว้ แต่ฉันไม่พบ นอกจากนี้เขายังไม่ได้แสดงวิธีใช้ไฟล์กำหนดค่าหลายไฟล์เหมือนตัวอย่างนี้
Auspex

232

สำหรับแอปคอนโซล. NET Core 2.0 ฉันทำสิ่งต่อไปนี้:

  1. สร้างไฟล์ใหม่ชื่อappsettings.jsonที่รูทของโปรเจ็กต์ (ชื่อไฟล์สามารถเป็นอะไรก็ได้)
  2. เพิ่มการตั้งค่าเฉพาะของฉันลงในไฟล์นั้นเป็น json ตัวอย่างเช่น:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. กำหนดค่าเพื่อคัดลอกไฟล์ไปยังไดเร็กทอรีเอาต์พุตเมื่อใดก็ตามที่สร้างโปรเจ็กต์(ใน VS -> Solution Explorer -> คลิกขวาที่ไฟล์ -> เลือก 'คุณสมบัติ' -> ขั้นสูง -> คัดลอกไปยังไดเรกทอรีผลลัพธ์ -> เลือก 'คัดลอกเสมอ')

  2. ติดตั้งแพ็คเกจ nuget ต่อไปนี้ในโครงการของฉัน:

    • Microsoft.Extensions.Configuration.Json
  3. เพิ่มสิ่งต่อไปนี้ในProgram.cs (หรือที่ใดก็ตามที่Main()อยู่):

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. จากนั้นอ่านค่าโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้:

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

ข้อมูลเพิ่มเติม: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
ดังที่ฉันสังเกตเห็นว่า Microsoft ไม่ได้ใช้ IConfigurationRoot ในตัวอย่าง แต่ใช้ IConfiguration
aligin

3
IConfigurationRootยังคงมีอยู่ในหลัก .NET 2.0 มันสืบทอดจากIConfigurationแต่ก็ถือว่าเป็นกรณีที่มาของมันที่ไม่ได้ใช้กันทั่วไป ไม่ว่าตัวอย่างโค้ดจะได้รับการอัปเดตเพื่อไม่รวมไว้และหลีกเลี่ยงความสับสน
Ray

10
2 หมายเหตุ: ในจุดที่ 4 คุณต้องใช้ Microsoft.Extensions.Configuration.Json เท่านั้น ... ซึ่งจะรวมอีก 2 รายการตามค่าเริ่มต้น ประการที่สอง: หากคุณต้องการโหลดส่วนไปยังออบเจ็กต์ควรทราบ: var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ("foo") ตัวเลือก); คุณจะต้องใช้ Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
FooOptions คลาสสาธารณะ {สตริงสาธารณะ myKey1 {get; set;} สตริงสาธารณะ 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

หากคุณใช้Microsoft.Extensions.Hosting(เวอร์ชัน 2.1.0+) เพื่อโฮสต์แอปคอนโซลและแอปหลักของ asp.net การกำหนดค่าทั้งหมดของคุณจะถูกแทรกด้วยHostBuilder's ConfigureAppConfigurationและConfigureHostConfigurationวิธีการ นี่คือการสาธิตเกี่ยวกับวิธีการเพิ่มappsettings.jsonตัวแปรและสภาพแวดล้อม:

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

ในการคอมไพล์โค้ดด้านบนคุณต้องเพิ่มแพ็คเกจเหล่านี้:

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

สภาพแวดล้อมถูกกำหนดอย่างไร? ถ้าฉันสร้างโปรไฟล์ใน launchSettings มันตั้งค่าจริงASPNETCORE_ENVIRONMENTแต่ตั้งค่าcontext.HostingEnvironment.EnvironmentNameไม่ถูกต้อง
Sinaesthetic

คุณควรใช้สภาพแวดล้อมเป็นหลักตรวจสอบรหัสนี้: github.com/aspnet/Hosting/blob/dev/src/…
Feiyu Zhou

@FeiyuZhou นั่นคือลิงค์ที่ตายแล้ว
Auspex

ไม่ได้ทั้งหมดของการแก้ปัญหานี้หลังจากที่new HostBuilder()ซ้ำซ้อน? ไม่ได้HostBuilderทำภายในทั้งหมด?
Auspex

@Auspex ขึ้นอยู่กับว่าคุณกำหนดแอปคอนโซลของคุณอย่างไร หากคุณต้องการกำหนดการกำหนดค่าที่กำหนดเองคุณควรตั้งค่าเช่นนี้ นี่คือเอกสารสำหรับ dotnet core 3.0: docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
Feiyu Zhou

10

ฉันเข้าใจผิด คุณสามารถใช้สิ่งใหม่ConfigurationBuilderจากแอปพลิเคชันคอนโซล netcore

ดูhttps://docs.asp.net/en/latest/fundamentals/configuration.htmlสำหรับตัวอย่าง

แต่เพียงหลัก aspnet IOptionsมีการพึ่งพาการฉีดออกจากกล่องเพื่อให้คุณไม่ได้มีความสามารถที่จะมีการตั้งค่าพิมพ์มั่นและจะฉีดให้พวกเขาใช้


9
คำตอบนี้ใช้ได้ แต่ควรมีรหัสที่จำเป็นจึงไม่มีการโหวตเพิ่ม
Matyas

4
สิ่งที่คุณต้องมีคือเพิ่มแพ็คเกจ: Microsoft.Extensions.Optionsและโทรservice.AddOptions();
Bruno Garcia

2
หน้าที่เชื่อมโยงทั้งหมด (ยาวมาก) ดูเหมือนจะเกี่ยวข้องกับ ASP.NET โดยมีการกล่าวถึง "WebHost" ในทุกตัวอย่าง ฉันได้รับคำถามนี้หลังจากพบหน้าที่เชื่อมโยงและคิดว่า "ตกลงนั่นคือ ASP.NET สิ่งที่เกี่ยวกับแอปคอนโซล"
mackenir

เป็นเรื่องแปลกเล็กน้อย @mackenir เพราะใน 3.0 ได้รับการปรับโครงสร้างใหม่ทั้งหมดเพื่อให้เป็นเพียงโฮสต์เท่านั้น! การอ้างอิงถึง WebHost เพียงอย่างเดียวคือชี้ให้คุณเห็นเอกสาร 2.2 พวกเขาอาจชัดเจนขึ้นเล็กน้อยว่าการConfigureWebHostDefaults()โทรในตัวอย่างเป็นทางเลือกและสำหรับเว็บแอปเท่านั้น
Auspex

4

จะเป็นแบบนี้สำหรับแอปพลิเคชันคอนโซลหลัก 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();

คุณสามารถฉีด ILoggerFactory, IConfiguration ในไฟล์SomeService.


2

บน. Net Core 3.1 เราต้องทำสิ่งเหล่านี้:

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

การใช้ SeriLog จะมีลักษณะดังนี้:

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

และส่วน Serilog appsetings.json สำหรับสร้างไฟล์หนึ่งไฟล์ทุกวันจะมีลักษณะดังนี้:

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

หลังจากลองใช้ไวยากรณ์เหล่านี้ทั้งหมดจากทั่วทั้งเว็บคุณเป็นคนที่เหมาะกับฉันและมันก็ง่ายมาก
GaneshT

ฉันดีใจที่ช่วยคุณได้
เออร์เนสต์

1

คุณสามารถใช้ไลบรารีLiteWare.Configurationได้ คล้ายกับ. NET Framework ดั้งเดิมConfigurationManagerและใช้ได้กับ. NET Core / Standard ฉลาดหลักแหลมคุณจะได้สิ่งที่ต้องการ:

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

คำเตือน: ฉันเป็นผู้เขียน LiteWare.Configuration


0

คล้ายกับโพสต์ของ Feiyu Zhou ฉันกำลังเพิ่มชื่อเครื่อง

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

ติดตั้งแพ็คเกจเหล่านี้:

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

รหัส:

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:

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

การตั้งค่าแอปของคุณสามารถทำได้ง่ายๆดังนี้: ป้อนคำอธิบายภาพที่นี่

นอกจากนี้ให้ตั้งค่าไฟล์ appsettings เป็น Content / Copy หากใหม่กว่า: เนื้อหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.