NET核心:如何为配置JSON库.控制台应用程序中的NET通用主机



我有一个控制台应用程序,它使用。NET通用主机,用于读取设置和依赖注入。

如何配置哪个库用于解析JSON配置文件(appsettings.json(?我想用Newtonsoft Json。NET而不是默认值(System.Text.Json(。

背景:我的设置文件有BigInteger值,Newtonsoft处理得很好,但无法使用默认值加载。

请注意,这是关于ASP的明确而非。NET,但却是一个普通的控制台应用程序。很难找到适用于简单控制台应用程序用例的东西,因为谷歌上的一切都是关于ASP的。NET。

设置主机的代码当前如下所示:

Host
.CreateDefaultBuilder()
.ConfigureLogging(...)
.ConfigureServices(...)
.UseConsoleLifetime()
.Build()
.StartAsync();

肯定有一个地方可以连接Newtonsoft JSON解析器。

(.NET 6(

配置在控制台应用程序中的工作原理与在ASP中的相同。NET。默认值可能不同,但概念是相同的。

您需要添加newtonsoft json配置提供程序,并去掉默认的json配置提供方。

请参阅此处的扩展方法文档:https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.configuration.newtonsoftjsonconfigurationextensions?view=dotnet-平台-ext-3.1&viewFallbackFrom=dotnet-plat-ext-6.0

有关添加和删除配置提供程序的一般信息,请参见此处:https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration-providers

完整控制台示例:

appsettings.json

{
"MySection": {
"MyBigValue": 2928298298298292898298292254353453534435353
}
}

程序.cs

//this requires adding the Microsoft.Extensions.Configuration.NewtonsoftJson package 
using System.Numerics;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Options;
var host = Host
.CreateDefaultBuilder()
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
//note this whole section is probably unneeded because conversion is happening in the ConfigurationBinder class 
//and json conversion has nothing to do with it

//remove old JSON source
var jsonSources = configuration.Sources.Where(s => s is JsonConfigurationSource).Cast<JsonConfigurationSource>().ToList();
jsonSources.ForEach(s => configuration.Sources.Remove(s));

//replace them with newtonsoft sources
jsonSources.ForEach(s =>
{
if (File.Exists(s.Path))
configuration.AddNewtonsoftJsonFile(s.Path);
});


//note this will put the JSON sources after the environment variable sources which is not how it is by default
})

.ConfigureServices((hostcontext, services) =>
{
var mySection = hostcontext.Configuration.GetSection("MySection");
services.Configure<MySection>(mySection);
})
.UseConsoleLifetime()
.Build();

host.StartAsync();

var mySection = host.Services.GetRequiredService<IOptions<MySection>>().Value;

Console.WriteLine(mySection.MyBigValueInt);
Console.ReadLine();


class MySection
{

public string MyBigValue { get; set; }
//a more complex alternative to using this property is to register a TypeConverter for BigInteger that does the string conversion
public BigInteger MyBigValueInt => BigInteger.Parse(MyBigValue);

}

相关内容

  • 没有找到相关文章

最新更新