我正在尝试将 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);
}
从 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);
您可以使用
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"
},
我很震惊没有人建议使用
IOptions
模式,甚至询问这是否是一个涉及 DI(依赖注入)的系统。如果系统确实使用 DI,我建议使用此处描述的 IOptions
模式Options Pattern,因为它不仅允许将选项注入到需要的地方,还允许更改通知,以便您可以接收配置更改并对其采取行动。
不要重新发明轮子!正如一些用户提到的,尝试使用 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;
}