gpt4 book ai didi

c# - 如何将 POCO 类传递给 .NET Core 配置

转载 作者:行者123 更新时间:2023-12-02 02:54:46 26 4
gpt4 key购买 nike

我正在从事 .NET Core 应用程序的集成测试,并希望使用一些测试配置。我的配置是一个 POCO 类,通过 appsettings.json 配置然后通过IOptions<T>消耗。在我的测试中,我想使用该类的一个实例。

代码如下:

 var mySettings = GetTestSettings(); // factory method returning POCO class 
var configurationBuilder = new ConfigurationBuilder();

// I am looking for something like
configurationBuilder.AddInMemoryObject("Settings", mySettings);

// does not work, result is just string
configurationBuilder.AddInMemoryCollection("Settings",
JsonConvert.SerializeObject(mySettings));

// requires filename
configurationBuilder.AddJsonFile("filename.json");

将 POCO 提供给配置的最简单方法是什么?

最佳答案

AddInMemoryCollection 采用 KeyValuePair 的集合,其中键是设置键,值是其值。来自问题的调用

configurationBuilder.AddInMemoryCollection("Settings", JsonConvert.SerializeObject(mySettings));

实际上将“Settings”作为键传递,并将整个 JSON 作为一个设置值传递,这预计不起作用。

但总体方法是正确的,您应该使用 AddInMemoryCollection 扩展调用。在传递给此调用的集合中,设置键是配置中的完整路径,以冒号分隔。假设您有以下设置 POCO:

public class SomeSettings
{
public string SomeKey1 { get; set; }
public int SomeKey2 { get; set; }
}

它是从以下 JSON 加载的

{
"SomeSettings": {
"SomeKey1": "SomeData",
"SomeKey2": 123
}
}

key 将为 SomeSettings:SomeKey1SomeSettings:SomeKey2

然后,您可以通过以下 AddInMemoryCollection 调用添加此类配置:

configurationBuilder.AddInMemoryCollection(new Dictionary<string, string>
{
{ "SomeSettings:SomeKey1", "SomeData" },
{ "SomeSettings:SomeKey2", 123 },
});

现在,如果您想通过一次调用添加设置 POCO,您可以编写简单的扩展方法,该方法将使用反射枚举设置类属性,并返回属性名称和值的键值对集合。

这是一个示例:

public static class ObjectExtensions
{
public static IEnumerable<KeyValuePair<string, string>> ToKeyValuePairs(this Object settings, string settingsRoot)
{
foreach (var property in settings.GetType().GetProperties())
{
yield return new KeyValuePair<string, string>($"{settingsRoot}:{property.Name}", property.GetValue(settings).ToString());
}
}
}

public static class ConfigurationBuilderExtensions
{
public static void AddInMemoryObject(this ConfigurationBuilder configurationBuilder, object settings, string settingsRoot)
{
configurationBuilder.AddInMemoryCollection(settings.ToKeyValuePairs(settingsRoot));
}
}

在测试中:

var configurationBuilder = new ConfigurationBuilder();
var mySettings = GetTestSettings();
configurationBuilder.AddInMemoryObject(mySettings, "Settings");

这样简单的ObjectExtensions.ToKeyValuePairs扩展方法将适用于普通的POCO,如上面的SomeSettings。但是,如果某些属性也是像这样的对象,则它将不起作用:

public class InnerSettings
{
public string SomeKey { get; set; }
}

public class OuterSettings
{
public InnerSettings InnerSettings { get; set; }
}

但是我相信您有一个想法,并且可以根据需要进行必要的调整。

关于c# - 如何将 POCO 类传递给 .NET Core 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49382742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com