Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
При необходимости мы можем использовать сразу несколько источников конфигурации:
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("conf.json") .AddEnvironmentVariables() .AddInMemoryCollection(new Dictionary<string, string> { {"name", "Tom"}, {"age", "31"} }); // создаем конфигурацию AppConfiguration = builder.Build(); } // свойство, которое будет хранить конфигурацию public IConfiguration AppConfiguration { get; set; } public void Configure(IApplicationBuilder app) { var color = AppConfiguration["color"]; // определен в файле conf.json string text = AppConfiguration["firstname"]; // определен в памяти app.Run(async (context) => { await context.Response.WriteAsync($"<p style='color:{color};'>{text}</p>"); }); } } }
Но в данном случае может возникнуть вопрос, как объединить все кастомные конфигурации с той конфигурацией, которая передается по умолчанию в приложения (из файла appsettings.json, параметров командной строки и переменных среды окружения)? Для этого мы можем использовать метод AddConfiguration(), в который передается добавляемая конфигурация:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; namespace ConfigurationApp { public class Startup { public Startup(IConfiguration config) { var builder = new ConfigurationBuilder() .AddJsonFile("conf.json") .AddInMemoryCollection(new Dictionary<string, string> { {"name", "Tom"}, {"age", "31"} }) .AddConfiguration(config); // создаем конфигурацию AppConfiguration = builder.Build(); } public IConfiguration AppConfiguration { get; set; } public void Configure(IApplicationBuilder app) { var color = AppConfiguration["color"]; // определен в файле conf.json string text = AppConfiguration["JAVA_HOME"]; // определен в переменных среды окружения app.Run(async (context) => { await context.Response.WriteAsync($"<p style='color:{color};'>{text}</p>"); }); } } }
В данном случае конфигурация по умолчанию, которая передается в конструктор класса Startup, объединяется с настроками в памяти и файлом conf.json. В итоге создается новый объект конфигурации. В дальнейшем мы можем использовать его в классе Startup, например, в методе Configure.
Тем не менее в примере мы можем столкнуться с одной проблемой - через механизм dependency injection мы можем получить по прежнему только конфигурацию по умолчанию, которая передается в конструктор Startup. Поэтому в этом случае нам надо передать в контейнер зависимостей новый объект конфигурации, который мы сами создаем - как обычно в методе ConfigureServices.
Вначале определим для тестирования компонент middleware:
using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; namespace ConfigurationApp { public class ConfigMiddleware { private readonly RequestDelegate _next; public ConfigMiddleware(RequestDelegate next, IConfiguration config) { _next = next; AppConfiguration = config; } public IConfiguration AppConfiguration { get; set; } public async Task InvokeAsync(HttpContext context) { await context.Response.WriteAsync($"name: {AppConfiguration["name"]} age: {AppConfiguration["age"]}"); } } }
В данном случае через сервис IConfiguration мы ожидаем получить параметры с ключами name и age.
Теперь внедрим конфигурацию в классе Startup:
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; namespace ConfigurationApp { public class Startup { public Startup(IConfiguration config) { var builder = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary<string, string> { {"name", "Tom"}, {"age", "31"} }) .AddConfiguration(config); AppConfiguration = builder.Build(); } public IConfiguration AppConfiguration { get; set; } public void ConfigureServices(IServiceCollection services) { services.AddTransient<IConfiguration>(provider => AppConfiguration); } public void Configure(IApplicationBuilder app) { app.UseMiddleware<ConfigMiddleware>(); } } }
В методе ConfigureServices в метод AddTransient()
через фабрику сервисов передается объект, который будет использоваться в качестве сервиса IConfiguration.
Теперь сервис IConfiguration представляет наш объект AppConfiguration. После этого вместо конфигурации по умолчанию мы сможем получать в
приложении наш объект конфигурации.