Ссылка Конфигурация в ASP.NET Core: привязка массива к классу
Bind
поддерживает привязку массивов к объектам с использованием индексов массива в ключах конфигурации.Любой формат массива, который представляет сегмент числового ключа (:0
, :1
,… :{n}
), способен связывать массив с массивом класса POCO.
Я приведу два примера:как использовать массивы в 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связать с массивами.