Служба регистрации ASP.NET Core 2.x, для которой требуется IConfigurationRoot - не может получить доступ к данным конфигурации - PullRequest
0 голосов
/ 07 марта 2019

Конфигурация зарегистрирована в моем приложении в Program.cs, как это

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .ConfigureAppConfiguration((hostingContext, config) =>
                   {
                       config.AddJsonFile("appsettings.secret.json", optional: true, reloadOnChange: true);
                   })
                   .UseStartup<Startup>()
                   .ConfigureLogging(logging =>
                   {override configuration in NLog.config

                       logging.ClearProviders();
                       logging.SetMinimumLevel(LogLevel.Trace);
                   })
                   .UseNLog(); // NLog: setup NLog for Dependency injection;

У меня есть класс, для которого требуется экземпляр IConfigurationRoot

public class ConfiguredKeyDataProtectionProvider : IDataProtectionProvider
{
    // Example configuration required for use of this class

    // {
    //     "ConfiguredKeyDataProtectionProvider": {
    //         "Key": {
    //             "TestPurpose": "asda2516shah"
    //         }
    //     }
    // }

    private readonly IConfigurationRoot _configurationRoot;

    public ConfiguredKeyDataProtectionProvider(IConfigurationRoot configurationRoot)
    {
        _configurationRoot = configurationRoot;
    }

    public IDataProtector CreateProtector(string purpose)
    {
        string encryptionKey = _configurationRoot.GetValue<string>("ConfiguredKeyDataProtectionProvider:Key:" + purpose);

        return new ConfiguredKeyDataProtector(encryptionKey);
    }
}

Я пытаюсь зарегистрировать экземпляр IConfiguredKeyDataProtectionProvider через DI. Я ожидаю, что, зарегистрировав экземпляр корневого файла IConfiguration (обратите внимание, что чтение файлов конфигурации дублируется в StartUp.cs - не уверен, если это необходимо), IConfiguredKeyDataProtectionProvider сможет увидеть данные конфигурации, но, похоже, это не так. дело.

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var configurationRoot = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile("appsettings.secret.json", optional: true, reloadOnChange: true)
            .Build();

        Configuration = configurationRoot;
    }

    public IConfigurationRoot Configuration { get; set; }

    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfigurationRoot>(Configuration);

        //...

        services.AddTransient<IDataProtectionProvider, ConfiguredKeyDataProtectionProvider>();

Как правильно настроить приложение, чтобы классы с IConfigurationRoot в конструкторе могли быть зарегистрированы с помощью внедрения зависимостей?

1 Ответ

1 голос
/ 08 марта 2019

Не знаю, зачем вам нужен интерфейс IConfigurationRoot, но так как вы уже создали экземпляр IConfigurationRoot до создания хоста, вы можете зарегистрировать корень в качестве одноэлементной службы с помощью .ConfigureServices(services =>{services.AddSingleton<IConfigurationRoot>(configRoot);}) :

Кроме того, нет необходимости создавать конфигурацию дважды, просто позвоните UseConfiguration(congfigRoot).

public static IWebHostBuilder CreateWebHostBuilder(string[] args) {

    // build the root 
    var configRoot = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false)
        // ...
        .Build();

    var builder = new WebHostBuilder();
    return builder
        // reuse the configRoot
        .UseConfiguration(configRoot)
        // register the configRoot as a singleton service
        .ConfigureServices(services =>{
            services.AddSingleton<IConfigurationRoot>(configRoot);
        })
        .UseStartup<Startup>()
        .ConfigureLogging(logging => {   
            //override configuration in NLog.config
            logging.ClearProviders();
            logging.SetMinimumLevel(LogLevel.Trace);
        })
        .UseKestrel();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...