Использование IConfiguration в глобальном масштабе в mvc6

Вероятно, я долго смотрел на это, но в последние несколько дней я прыгал в MVC6 для asp.net, в то время как мне это действительно нравится, я не могу найти удобный способ доступа к Конфигурация после того, как она определена в Start.cs с помощью

Configuration = new Configuration()
    .AddJsonFile("config.json")
    ...

Итак, мне нужно добавить его в DI или он уже есть? Или я должен создать новый экземпляр всякий раз, когда мне нужно его использовать, так как можно создавать разные конфигурации (например, для IIdentityMessageService), создать sendgrid.json и загрузить его в самой службе?

Возможно, очень простое решение, но, как я уже сказал, я смотрю на это уже несколько дней.

Ответ 1

Выполняйте загрузку Конфигураций в Startup.cs. Если они вам понадобятся в другом месте, вы можете загрузить значения в соответствующие POCOs и зарегистрировать их в DI, чтобы вы могли вводить их там, где они вам нужны. Это позволяет организовать вашу конфигурацию в разных файлах и в разных POCO таким образом, чтобы это имело смысл для вашего приложения. Это уже встроено в поддержку этого в инъекции зависимостей. Вот как вы это сделаете:

A POCO, чтобы включить вашу конфигурацию:

public class SomeOptions
{
    public string EndpointUrl { get; set; }
}

Ваш Startup.cs загружает конфигурацию в POCO и регистрирует ее в DI.

public class Startup
{
    public Startup()
    {
        Configuration = new Configuration()
                    .AddJsonFile("Config.json")
                    .AddEnvironmentVariables();
    }

    public IConfiguration Configuration { get; set; }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<SomeOptions>(options => 
            options.EndpointUrl = Configuration.Get("EndpointUrl"));

        services.AddMvc();
    }
}

Затем в вашем контроллере получите конфигурацию POCO, которую вы создали в Startup.cs через инъекцию зависимостей следующим образом:

public class SomeController
{
    private string _endpointUrl;
    public SomeController(IOptions<SomeOptions> options)
    {
        _endpointUrl = options.Options.EndpointUrl;
    }
}

Протестировано с 1.0.0-beta1 сборками aspnet5.

Подробнее см. Основы настройки ASP.Net 5.