簡體   English   中英

.Net 6.0 配置文件

[英].Net 6.0 Configuration files

得到了一個應用程序,它為 VBA 應用程序提供數據。 現在嘗試獲取配置文件(appsettings.json & appsettings.Development.Json)。 現在它是一個 .net6.0 控制台應用程序,后來我將它變成了一個 IconTrayApp。

遇到一個問題,主 Program.cs 方法獲取 appsettings.json,worker 獲取 appsettings.Developement.json。 我明白為什么 Main() 會得到無環境 json,因為我明確加載了它。 但我希望應用程序在 IDE 中都使用相同的文件。

這是program.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using PostDataService.InterfaceModels;
using Serilog;
using Serilog.Events;
using System;

namespace PostDataService
{
  public class Program
  {
    public static void Main(string[] args)
    {

      var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
      IConfiguration config = builder.Build();
      string _logFQN = config["PostConfig:Basefolder"] + config["PostConfig:LogsFolder"] + config["PostConfig:LogFname"];
      string _LogTemplate = config["PostConfig:LogTemplate"];

      var loggerConfig = new LoggerConfiguration()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Verbose)
        .Enrich.FromLogContext()
        .Enrich.WithThreadId()
        .Enrich.WithEnvironmentUserName()
        .WriteTo.File(_logFQN,
        fileSizeLimitBytes: 524288000,
        rollOnFileSizeLimit: true,
        rollingInterval: RollingInterval.Day,
        outputTemplate: _LogTemplate);

      Log.Logger = loggerConfig.CreateLogger();
      try
      {
        Log.Write(LogEventLevel.Information, "Start USPS Data Server");
        CreateHostBuilder(args).Build().Run();
      }
      catch (Exception ex)
      {
        Log.Fatal(ex, "Host terminated unexpectedly");
      }
      finally
      {
        Log.Information("USPS Server stopped");
        Log.CloseAndFlush();
      }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog()
            .ConfigureServices((hostContext, services) =>
            {
              IConfiguration configuration = hostContext.Configuration;
              WorkerOptions options = configuration.GetSection("PostConfig").Get<WorkerOptions>();
              services.AddSingleton(options);
              services.AddHostedService<Worker>();
            });

  }
}

這里是 appsettings.json (appsettings.Development.json)

{
  "PostConfig": {
    "BaseFolder": "./App_Data/",
    "LogsFolder": "logs/",
    "SystemFQN": "C:/Test/PostalDB/PostalData.db",
    "CustFQN": "C:/Test/PostalDB/PostalCustomer.db",
    "LogFname": "USPS_.log",
    "LogTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}\t{EnvironmentUserName}\t[{Level:u4}]\t<{ThreadId}>\t{Message:lj}{NewLine}{Exception}"
  }
}

我確實嘗試在配置生成器中使用.AddEnvironmentVariables(),但這似乎並沒有改變。 我懷疑是因為顯式的 addjsonfile 調用。

您的主應用程序(主應用程序- 1st )使用任何appsettings.json並且您需要在被調用的控制台應用程序(輔助應用程序 - 2nd )中使用相同的文件。

您可以使用 args 調用第二個

1. 主程序的設置文件
例如位於“C:\appsettings.json”

{
  "AppName": "Value from main/primary/1st program AppSettings.json"
}

2.從主程序調用
您可以使用 arg SettingsFile發送任何文件名

dotnet.\CommandLineArgs.dll --SettingsFile=C:\appsettings.json
或者
.\CommandLineArgs.exe --SettingsFile=C:\appsettings.json

3. 二級程序代碼

public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile(args.Where(a => a.Contains("SettingsFile")).First().Split("=")[1], optional: false, reloadOnChange: true);
        IConfiguration config = builder.Build();
        Console.WriteLine(config.GetValue<string>("AppName"));
        Console.ReadLine();
    }
}

Output
模擬 powershell 是主程序。 Primary將值為C:\appsettings.json的 arg SettingsFile發送到Secondary 輔助程序將 json 文件名添加到配置生成器並構建配置 object。

1

2

參考

Main() 和命令行 arguments
命令行 arguments

我可能有點不清楚,工人得到了 appsettings.Development.json 文件,因為我在 VS 中運行是正確的。 我正在尋找的是一種在 Main() 方法中獲得相同行為的干凈方法。

我接受了 Guru Stron 的評論並強制它包含 appsettings.dev... 文件,如下所示:

      var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environments.Development}.json", optional: true, reloadOnChange: true);

它似乎工作正常,只是感覺我在硬編碼應該被烘焙的東西。

Also if I run the application from the Windows File Explorer I get the appsettings.developement.json values in the main but the appsettings.json in the worker class. 這是有意義的,因為每個構建器調用的文件 appsettings.development.json 會覆蓋 appsettings.json。 不理想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM