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

我正在进行.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: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; }
}

但是,我相信您有个主意,可以根据需要进行必要的调整。

java.net.URI.create异常 - java

java.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事件删除按钮(图像按钮)时遇到问题。我知道对此还有其他疑问,但是我什么都不懂!我不明白没有答案!我做了所有其他所有问题中指定的内容!此页面中使“重定向”到示例的其他事件效果很好!我很清楚?需要更多细节吗?堆栈跟踪或更多代码?错误是: 无效的回发或回调参数。使用配置或页面中的启用事件验证。为了安全起见,此功能验证回发或回调事件的参数源自最初呈现它…