。NET Core控制台应用程序依赖项注入-如何配置Newtonsoft.Json的使用以反序列化IOptions <>

问题描述 投票:0回答:1

在读取json设置文件的各个部分时,是否可以将.Net Core 3.1控制台应用程序配置为使用Newtonsoft.Json库反序列化IOptions <>(来自Microsoft.Extensions.Options)?]

 public MyService(IOptions<MyAppDataSettings> MyAppDataOptions)
 {
     var myAppDataOptions = MyAppDataOptions?.Value ?? throw new ArgumentNullException(nameof(MyAppDataSettings));
 }

结果不同于直接使用System.Text.Json反序列化时的结果:

var appJsonData = System.Text.Json.JsonSerializer.Deserialize<MyAppDataSettings>(File.ReadAllText(appJsonPath));

设置包含一个“有序的”字典。直接调用解串器时,键的顺序正确,如json设置文件中所示。但是IOptions <>返回的值包含一个字典,其中的键按字母顺序排序。然后,我尝试强制使用NewtonsoftJson:

private static void ConfigureServices(IConfiguration configuration, IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

    services.Configure<MyAppDataSettings>(configuration.GetSection(nameof(MyAppDataSettings)));
    services.AddSingleton<IMyService, MyService>();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
         new HostBuilder()
             .ConfigureServices((context, services) =>
             {
                 ConfigureServices(context.Configuration, services);
             })
             .ConfigureAppConfiguration((context, configurationBuilder) =>
             {
                 var appExecPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
                 var appSettingsPath = Path.GetFullPath(Path.Combine(appExecPath, @"Settings"));

                 configurationBuilder
                     .SetBasePath(appSettingsPath)
                     .AddJsonFile("MySettings.json", false);
             });

使用Newtonsoft.Json解串器时的结果与使用System.Text.Json时的结果相同。

var appJsonData = JsonConvert.DeserializeObject<MyAppDataSettings>(File.ReadAllText(appJsonPath));

所以问题是:IOptions 如何实际反序列化?我想“魔术”发生在Microsoft.Extensions.Configuration.Json库中。

在阅读...的各个部分时,可以配置.Net Core 3.1控制台应用程序以使用Newtonsoft.Json库反序列化IOptions <>(来自Microsoft.Extensions.Options)。

[JSON和Dictionary都不保证键顺序。根据词典文档MSDN Dictionary

出于枚举的目的,字典中的每个项目都被视为代表值及其键的KeyValuePair结构。返回物品的顺序是不确定的。

根据我的经验,我强烈建议您重新考虑您用于配置的方法,并摆脱订单依赖性。

json .net-core dependency-injection console-application settings
1个回答
0
投票
[JSON和Dictionary都不保证键顺序。根据词典文档MSDN Dictionary
© www.soinside.com 2019 - 2024. All rights reserved.