将 appsettings.json 映射到类

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

我正在尝试将 appsettings.json 转换为 C# 类

我使用

Microsoft.Extensions.Configuration
从 appsettings.json 读取配置

我使用反射编写以下代码,但我正在寻找更好的解决方案

foreach (var (key, value) in configuration.AsEnumerable())
{
    var property = Settings.GetType().GetProperty(key);
    if (property == null) continue;
    
    object obj = value;
    if (property.PropertyType.FullName == typeof(int).FullName)
        obj = int.Parse(value);
    if (property.PropertyType.FullName == typeof(long).FullName)
        obj = long.Parse(value);
    property.SetValue(Settings, obj);
}
c# .net-core configuration
4个回答
20
投票

appsettings.json 文件构建配置:

var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional = false)
            .Build()

然后添加 Microsoft.Extensions.Configuration.Binder nuget 包。您将拥有将配置(或配置部分)绑定到现有或新对象的扩展。

例如你有一个设置类(顺便说一句,按照惯例,它称为选项)

public class Settings
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}

appsettings.json

{
  "Foo": "Bob",
  "Bar": 42
}

要将配置绑定到新对象,您可以使用

Get<T>()
扩展方法:

var settings = config.Get<Settings>();

要绑定到现有对象,您可以使用

Bind(obj)
:

var settings = new Settings();
config.Bind(settings);

4
投票

您可以使用

Dictionary
获取json,然后使用
JsonSerializer
转换json。

public IActionResult get()
    {
        Dictionary<string, object> settings = configuration
        .GetSection("Settings")
        .Get<Dictionary<string, object>>();
        string json = System.Text.Json.JsonSerializer.Serialize(settings);

        var setting = System.Text.Json.JsonSerializer.Deserialize<Settings>(json);

        return Ok();
    }

这是模型

public class Settings
{
    public string property1 { get; set; }
    public string property2 { get; set; }
}

在appsettings.json中

 "Settings": {
  "property1": "ap1",
  "property2": "ap2"
 },

enter image description here


2
投票

我很震惊没有人建议使用

IOptions
模式,甚至询问这是否是一个涉及 DI(依赖注入)的系统。如果系统确实使用 DI,我建议使用此处描述的
IOptions
模式Options Pattern,因为它不仅允许将选项注入到需要的地方,还允许更改通知,以便您可以接收配置更改并对其采取行动。


0
投票

不要重新发明轮子!正如一些用户提到的,尝试使用 Microsoft 提供的选项模式。

以下是如何执行此操作的简单示例:

appsetting.json

{
  "AppSettings": {
    "Setting1": "Value1",
    "Setting2": "Value2"
  }
}

AppOptions.cs

public class AppOptions
{
    public string Setting1 { get; set; }
    public string Setting2 { get; set; }
}

通过依赖注入来配置它

services.Configure<AppOptions>(Configuration.GetSection("AppSettings"));

这就是将其注入到服务中的方式,我使用 IOptions,并且 我强烈建议根据您的情况检查其他选项接口,例如 IOptionsSnapshot

public SomeService(IOptions<AppOptions> appOptions)
{
    _appOptions = appOptions.Value;
}
© www.soinside.com 2019 - 2024. All rights reserved.