Конфигурация по умолчанию и Dependency Injection

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

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

Объединение источников конфигурации

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

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. После этого вместо конфигурации по умолчанию мы сможем получать в приложении наш объект конфигурации.

Сервис IConfiguration в ASP.NET Core
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850