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

Mic*_*dak 5 xml .net-core asp.net-core

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

到目前为止,一切工作正常,直到我必须在 XML 文件中创建一个数组。有可能吗?

Nko*_*osi 4

ASP.NET Core 中的参考配置:将数组绑定到类

\n\n
\n

支持Bind使用配置键中的数组索引将数组绑定到对象。任何公开数字键段(:0:1、 \xe2\x80\xa6 :{n})的数组格式都能够将数组绑定到 POCO 类数组。

\n
\n\n

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

\n\n

使用以下内容config.xml

\n\n
<configuration>\n  <tvshow>\n    <metadata>\n      <series>Dr. Who</series>\n      <title>The Sun Makers</title>\n      <airdate>11/26/1977</airdate>\n      <episodes>4</episodes>\n    </metadata>\n    <actors name="0">Tom Baker</actors>\n    <actors name="1">Louise Jameson</actors>\n    <actors name="2">John Leeson</actors>\n    <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>\n  </tvshow>\n</configuration>\n
Run Code Online (Sandbox Code Playgroud)\n\n

匹配的 POCO 看起来像

\n\n
<configuration>\n  <tvshow>\n    <metadata>\n      <series>Dr. Who</series>\n      <title>The Sun Makers</title>\n      <airdate>11/26/1977</airdate>\n      <episodes>4</episodes>\n    </metadata>\n    <actors name="0">Tom Baker</actors>\n    <actors name="1">Louise Jameson</actors>\n    <actors name="2">John Leeson</actors>\n    <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>\n  </tvshow>\n</configuration>\n
Run Code Online (Sandbox Code Playgroud)\n\n

给定<actors>元素的名称,生成的路径将是

\n\n
tvshow:actors:0\ntvshow:actors:1\ntvshow:actors:2\n
Run Code Online (Sandbox Code Playgroud)\n\n

遵循文件中所述的约定

\n\n

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

\n\n
public class TvShow {\n    public Metadata Metadata { get; set; }\n    public string[] Actors { get; set; } //<-- TAKE NOTE\n    public string Legal { get; set; }\n}\n\npublic class Metadata {\n    public string Series { get; set; }\n    public string Title { get; set; }\n    public DateTime AirDate { get; set; }\n    public int Episodes { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在另一个例子中,假设config.xml修改为以下内容

\n\n
<?xml version="1.0" encoding="utf-8" ?> \n<configuration>\n  <tvshow>\n    <metadata>\n      <series>Dr. Who</series>\n      <title>The Sun Makers</title>\n      <airdate>11/26/1977</airdate>\n      <episodes>4</episodes>\n    </metadata>\n    <actors>\n      <names name="0">Tom Baker</names>\n      <names name="1">Louise Jameson</names>\n      <names name="2">John Leeson</names>\n    </actors>\n    <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>\n  </tvshow>\n</configuration>\n
Run Code Online (Sandbox Code Playgroud)\n\n

将受影响的 POCO 重构为

\n\n
tvshow:actors:0\ntvshow:actors:1\ntvshow:actors:2\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,按照约定,数组元素的路径需要类似于

\n\n
tvshow:actors:names:0\ntvshow:actors:names:1\ntvshow:actors:names:2\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试时也表现出预期的效果

\n\n
[TestClass]\npublic class Configuration_Should {\n    [TestMethod]\n    public void Bind_Xml_Arrays() {\n        var config = new ConfigurationBuilder()\n        .SetBasePath(Directory.GetCurrentDirectory())\n        .AddXmlFile("config.xml", optional: true, reloadOnChange: true)\n        .Build();\n\n        var tvShow = config.GetSection("tvshow").Get<TvShow>();\n\n        tvShow.Should().NotBeNull();\n\n        tvShow.Actors.Should().HaveCount(3);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该文档以及文档应该为您正确构建 XML 配置以绑定到数组提供足够的基础。

\n