[英].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。
參考
我可能有點不清楚,工人得到了 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.