Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
В ASP.NET Core мы можем не просто получать конфигурационные настройки в виде разрозненных пар ключ-значение, но и проецировать данные конфигурации на классы C#.
Например, определим в проекте новый файл person.json, который будет хранить данные пользователя:
{ "age": 18, "name": "Tom" }
Под него в проекте определим класс Person:
public class Person { public string Name { get; set; } public int Age { get; set; } }
Теперь изменим класс Startup и свяжем конфигурацию из файла json с объектом класса Person:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using System.Collections.Generic; namespace ConfigurationApp { public class Startup { public Startup() { var builder = new ConfigurationBuilder() .AddJsonFile("person.json"); AppConfiguration = builder.Build(); } public IConfiguration AppConfiguration { get; set; } public void Configure(IApplicationBuilder app) { var tom = new Person(); AppConfiguration.Bind(tom); app.Run(async (context) => { await context.Response.WriteAsync($"<p>Name: {tom.Name}</p><p>Age: {tom.Age}</p>"); }); } } }
Ключевой момент заключается в применении метода Bind:
var tom = new Person(); AppConfiguration.Bind(tom);
Для объекта IConfiguration определен метод Bind(), который в качестве параметра принимает объект, который надо связать с данными. Стоит отметить, что между конфигурацией в json и классом Person имеется соответствие по названию свойств, благодаря чему может осуществляться связка (регистр в данном случае роли не играет).
В качестве альтернативы методу Bind мы могли бы использовать метод Get<T>(), который возвращает объект созданного класса:
Person tom = AppConfiguration.Get<Person>();
В этом случае нам не надо предварительно создавать объект класса Person.
Рассмотрим привязку более сложных по структуре данных. Определим следующий файл person.json:
{ "age": 18, "name": "Tom", "languages": [ "English", "German", "Spanish" ], "company": { "title": "Microsoft", "country": "USA" } }
Для представления этих данных в коде C# определим следующие классы:
public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Languages { get; set; } public Company Company { get; set; } } public class Company { public string Title { get; set; } public string Country { get; set; } }
Теперь выполним привязку из конфигурации json в объекты классов C# в классе Startup:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using System.Collections.Generic; namespace ConfigurationApp { public class Startup { public Startup() { var builder = new ConfigurationBuilder() .AddJsonFile("person.json"); AppConfiguration = builder.Build(); } public IConfiguration AppConfiguration { get; set; } public void Configure(IApplicationBuilder app) { var tom = new Person(); AppConfiguration.Bind(tom); app.Run(async (context) => { string name = $"<p>Name: {tom.Name}</p>"; string age = $"<p>Age: {tom.Age}</p>"; string company = $"<p>Company: {tom.Company?.Title}</p>"; string langs = "<p>Languages:</p><ul>"; foreach (var lang in tom.Languages) { langs+=$"<li><p>{lang}</p></li>"; } langs+="</ul>"; await context.Response.WriteAsync($"{name}{age}{company}{langs}"); }); } } }
Возьмем выше определенные классы Person и Company. И добавим в проект файл person.xml, который будет содержать аналогичные данные:
<?xml version="1.0" encoding="utf-8" ?> <person> <name>Tom</name> <age>35</age> <languages name="0">English</languages> <languages name="1">German</languages> <languages name="2">Chinese</languages> <company> <title>Microsoft</title> <country>USA</country> </company> </person>
Обратите внимание на установку в файле xml массивов - они имеют атрибут name, который определяет условный индекс.
В классе Startup изменим конструктор, установив применение конфигурации из выше определенного файла xml:
public Startup() { var builder = new ConfigurationBuilder() .AddXmlFile("person.xml"); AppConfiguration = builder.Build(); }
Весь остальной код остается прежним.
В примерах выше выполнялась привязка корневого объекта конфигурации, однако также можно осуществлять привязку отдельных секций. Например, выше в файле json и xml была определена секция company, которая хранит компанию пользователя. Выполним привязку отдельно этой секции к объекту класса Company:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using System.Collections.Generic; namespace ConfigurationApp { public class Startup { public Startup() { var builder = new ConfigurationBuilder() .AddJsonFile("person.json"); AppConfiguration = builder.Build(); } public IConfiguration AppConfiguration { get; set; } public void Configure(IApplicationBuilder app) { Company company = AppConfiguration.GetSection("company").Get<Company>(); app.Run(async (context) => { await context.Response.WriteAsync($"<p>Title: {company.Title}</p><p>Country: {company.Country}</p>"); }); } } }
С помощью метода GetSection()
получаем нужную нам секцию конфигурации и затем также можно вызвать методы Bind или Get и выполнить привязку.