Конфигурация зарегистрирована в моем приложении в 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 в конструкторе могли быть зарегистрированы с помощью внедрения зависимостей?