gpt4 book ai didi

xml - ASP.NET Core 的 XML 配置提供程序中的数组

转载 作者:行者123 更新时间:2023-12-04 19:40:22 24 4
gpt4 key购买 nike

我正在编写的 ASP.NET Core (2.1) 应用程序使用两个配置源:JSON 和 XML(使用框架的标准 AddJsonFileAddXmlFile。XML 设置具有更高的优先级(例如,应该覆盖 JSON 文件中的匹配设置) .

到目前为止一切正常,直到我不得不在 XML 文件中创建一个数组。甚至可能吗?

最佳答案

引用 Configuration in ASP.NET Core: Bind an array to a class

The Bind supports binding arrays to objects using array indices in configuration keys. Any array format that exposes a numeric key segment (:0, :1, … :{n}) is capable of array binding to a POCO class array.



我将提供两个示例来说明如何在 XML 配置文件中使用数组

使用以下 config.xml
<configuration>
<tvshow>
<metadata>
<series>Dr. Who</series>
<title>The Sun Makers</title>
<airdate>11/26/1977</airdate>
<episodes>4</episodes>
</metadata>
<actors name="0">Tom Baker</actors>
<actors name="1">Louise Jameson</actors>
<actors name="2">John Leeson</actors>
<legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
</tvshow>
</configuration>

匹配的 POCO 看起来像

public class TvShow {
public Metadata Metadata { get; set; }
public string[] Actors { get; set; } //<-- TAKE NOTE
public string Legal { get; set; }
}

public class Metadata {
public string Series { get; set; }
public string Title { get; set; }
public DateTime AirDate { get; set; }
public int Episodes { get; set; }
}

鉴于 <actors>元素的名称,生成的路径将是
tvshow:actors:0
tvshow:actors:1
tvshow:actors:2

遵循文件中所述的约定

所以在下面的单元测试中它会按预期通过。

[TestClass]
public class Configuration_Should {
[TestMethod]
public void Bind_Xml_Arrays() {
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddXmlFile("config.xml", optional: true, reloadOnChange: true)
.Build();

var tvShow = config.GetSection("tvshow").Get<TvShow>();

tvShow.Should().NotBeNull();

tvShow.Actors.Should().HaveCount(3);
}
}

在另一个示例中,假设 config.xml被修改为以下
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
<tvshow>
<metadata>
<series>Dr. Who</series>
<title>The Sun Makers</title>
<airdate>11/26/1977</airdate>
<episodes>4</episodes>
</metadata>
<actors>
<names name="0">Tom Baker</names>
<names name="1">Louise Jameson</names>
<names name="2">John Leeson</names>
</actors>
<legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
</tvshow>
</configuration>

将受影响的 POCO 重构为

public class TvShow {
public Metadata Metadata { get; set; }
public Actors Actors { get; set; }
public string Legal { get; set; }
}

//...Metadata omitted for brevity

public class Actors {
public string[] Names { get; set; }
}

同样,按照惯例,数组元素的路径需要看起来像
tvshow:actors:names:0
tvshow:actors:names:1
tvshow:actors:names:2

在测试时它的行为也符合预期

[TestClass]
public class Configuration_Should {
[TestMethod]
public void Bind_Xml_Arrays() {
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddXmlFile("config.xml", optional: true, reloadOnChange: true)
.Build();

var tvShow = config.GetSection("tvshow").Get<TvShow>();

tvShow.Should().NotBeNull();

tvShow.Actors.Names.Should().HaveCount(3);
}
}

这与文档一起应该为您正确构建 XML 配置以绑定(bind)到数组提供了足够的基础。

关于xml - ASP.NET Core 的 XML 配置提供程序中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54915530/

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