Проекция конфигурации на классы

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 14.11.2019

В 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 имеется соответствие по названию свойств, благодаря чему может осуществляться связка (регистр в данном случае роли не играет).

Привязка конфигурации json и класса C# в ASP.NET Core

В качестве альтернативы методу 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}");
            });
        }
    }
}
Привязка комплексных объектов из конфигурации json к классам C# в ASP.NET Core

Привязка конфигурации из xml

Возьмем выше определенные классы 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 и выполнить привязку.

Привязка секции конфигурации к объекту класса C# в ASP.NET Core
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850