我正在进行.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
的集合,其中键是设置键,而value是其值。这个问题的电话
configurationBuilder.AddInMemoryCollection("Settings", JsonConvert.SerializeObject(mySettings));
实际上将“设置”作为键传递,将整个JSON作为一个设置值传递,这预计将不起作用。
但是总体方法是正确的,您应该使用AddInMemoryCollection
扩展调用。在传递给此调用的集合中,设置键是配置中的完整路径,以冒号分隔。假设您有以下POCO设置:
public class SomeSettings
{
public string SomeKey1 { get; set; }
public int SomeKey2 { get; set; }
}
并从以下JSON加载
{
"SomeSettings": {
"SomeKey1": "SomeData",
"SomeKey2": 123
}
}
键是SomeSettings:SomeKey1
和SomeSettings: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; }
}
但是,我相信您有个主意,可以根据需要进行必要的调整。
java.net.URI.create异常 - javajava.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…
调用SignalR Hub不适用于Asp.Net Core Web API - c#我是SignalR的新手。我正在尝试设置一个Asp.Net Core WebAPI,以便其他客户端可以使用SignalR连接到它并获取实时数据。我的Hub类是:public class TimeHub : Hub { public async Task UpdateTime(string message) { await Clients.All.SendAs…
Visual Studio,ASP.Net(.Net Framework),并在项目中包含NuGet安装的软件包 - javascript我在Visual Studio 2017中有一个主要由JavaScript组成的ASP.Net(.Net Framework)MVC Web应用程序。我已经使用NuGet安装了一个软件包(特别是marker-animate-unobtrusive软件包。)文档继续说我应该在我的HTML页面中包含JavaScript,但是在仔细检查了NuGet的内容后,我不确…
在ASP.NET WebForms中在服务器端初始化bootsrap datatimepicker - javascript我有这个HTML<div class='datepicker input-group date' id='datetimepickerStart'> <input type='text' class="form-control" /> <span c…
ImageButton中的无效回发或回调参数 - c#我的Click事件删除按钮(图像按钮)时遇到问题。我知道对此还有其他疑问,但是我什么都不懂!我不明白没有答案!我做了所有其他所有问题中指定的内容!此页面中使“重定向”到示例的其他事件效果很好!我很清楚?需要更多细节吗?堆栈跟踪或更多代码?错误是: 无效的回发或回调参数。使用配置或页面中的启用事件验证。为了安全起见,此功能验证回发或回调事件的参数源自最初呈现它…