Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Для работы с конфигурацией в нашем распоряжение есть ряд функционала - для работы с 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
То есть на первой строке идет ключ настройки, а на второй ее значение и так далее.
Таким образом, у нас получится следующая структура проекта:
И в конце изменим клас 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>"); }); } } }
И при обращении к приложению будут использованы настройки из текстового файла: