Создание провайдера конфгурации

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

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

Для работы с конфигурацией в нашем распоряжение есть ряд функционала - для работы с json, xml и так далее. Однако, в каких-то ситуациях, возможно, этого функционала окажется недостаточно. И в этом случае мы можем определить свои источники и провайдеры конфигурации.

Создание конфигурации вовлекает три компонента: IConfigurationSource (определяет источник конфигурации), ConfigurationProvider (сам провайдер конфигурации) и некий класс, который добавляет метод расширения к объекту IConfiguration.

Допустим, мы хотим хранить конфигурацию в простом текстовом файле. И для этого добавим новый класс, который назовем TextConfigurationProvider:

using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;

namespace ConfigurationApp
{
    public class TextConfigurationProvider : ConfigurationProvider
    {
        public string FilePath { get; set; }
        public TextConfigurationProvider(string path)
        {
            FilePath = path;
        }
        public override void Load()
        {
            var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
            using (FileStream fs = new FileStream(FilePath,FileMode.Open))
            {
                using (StreamReader textReader = new StreamReader(fs))
                {
                    string line;
                    while((line=textReader.ReadLine())!=null)
                    {
                        string key = line.Trim();
                        string value = textReader.ReadLine();
                        data.Add(key, value);
                    }
                }
            }
            Data = data;   
        }
    }
}

Класс TextConfigurationProvider будет представлять провайдер конфигурации и поэтому должен быть унаследован от класса ConfigurationProvider.

В этом классе с помощью FileStream и StreamReader происходит считывание текстового файла и добавление данных в словарь data. Для загрузки данных переопределяется метод Load(), определенный в базовом классе.

В данном случае мы предполагаем, что на первой строке будет располагаться ключ, а на следующей строке значение. И после считывания эти ключ и значение будут попадать в словарь data.

После считывания словарь data присваивается свойству Data, которое унаследовано от ConfigurationProvider. Это свойство как раз и хранит все те конфигурационные настройки, которые потом используются в программе.

И чтобы получить путь к файлу, он передается через параметр конструктора.

Далее нам надо обращаться к этому провайдеру. Для этого определим класс источника конфигурации, который назовем TextConfigurationSource:

using Microsoft.Extensions.Configuration;

namespace ConfigurationApp
{
    public class TextConfigurationSource : IConfigurationSource
    {
        public string FilePath { get; private set; }
        public TextConfigurationSource(string filename)
        {
            FilePath = filename;
        }
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            // получаем полный путь для файла
            string filePath = builder.GetFileProvider().GetFileInfo(FilePath).PhysicalPath;
            return new TextConfigurationProvider(filePath);
        }
    }
}

Источник конфгурации должен реализовать интерфейс IConfigurationSource, и в частности, его метод Build. В этот метод в качестве параметра передается строитель конфгурации - то есть тот объект, с помощью которого в конструкторе класса Startup мы будем создавать конфигурацию.

В данном случае этот объект нам позволяет получить полный путь к текстовому файлу. Краткое название файла (относительный путь) передается в класс источника через конструктор и хранится в свойстве FilePath. После создания полного пути к файлу этот путь передается в конструктор TextConfigurationProvider.

Чтобы задействовать функционал источника конфигурации создадим вспомогательный класс TextConfigurationExtensions:

using Microsoft.Extensions.Configuration;
using System;

namespace ConfigurationApp
{
    public static class TextConfigurationExtensions
    {
        public static IConfigurationBuilder AddTextFile(
            this IConfigurationBuilder builder, string path)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentException("Путь к файлу не указан");
            }
            
            var source = new TextConfigurationSource(path);
            builder.Add(source);
            return builder;
        }
    }
}

Этот класс определяет для объекта IConfigurationBuilder метод расширения AddTextFile(), в котором создается источник конфигурации TextConfigurationSource, который затем добавляется к строителю конфигурации:

var source = new TextConfigurationSource(path);
builder.Add(source);

Теперь добавим в проект сам файл конфигурации. Пусть он будет называться config.txt и будет иметь следующее содержимое:

color
red
text
Hello ASP.NET Core

То есть на первой строке идет ключ настройки, а на второй ее значение и так далее.

Таким образом, у нас получится следующая структура проекта:

Переопределение конфигурации в ASP.NET Core

И в конце изменим клас Startup, чтобы он использовал конфигурацию из текстового файла:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;

namespace ConfigurationApp
{
    public class Startup
    {
        public Startup()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(System.IO.Directory.GetCurrentDirectory());
			
            builder.AddTextFile("config.txt");
            AppConfiguration = builder.Build();
        }
        public IConfiguration AppConfiguration { get; set; }

        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app)
        {
            var color = AppConfiguration["color"];
			var text = AppConfiguration["text"];
			app.Run(async (context) =>
			{
				await context.Response.WriteAsync($"<p style='color:{color};'>{text}</p>");
			});
        }
    }
}

И при обращении к приложению будут использованы настройки из текстового файла:

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