web-dev-qa-db-ja.com

.net core 2の起動時にIConfigurationRootにアクセスする方法は?

エンティティフレームワークでカスタムConfigurationProviderを記述しました。実行時にも更新できるようにしたいので、 IWritableableOption を作成しました。

アップデート後に設定を更新する必要があります。これは IConfigurationRoot.Reload

ただし、.net core 2でIConfigurationRootを取得するにはどうすればよいですか?

私が見つけたのは、以前のバージョンではIConfigurationRootがスタートアップの一部だったということです。ただし、.net core 2では、より単純なタイプIConfigurationのみがあります。

public Startup(IConfiguration configuration)
{
    // I tried to change this to IConfigurationRoot,
    // but this results in an unresolved dependency error
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

私も発見しました、私は自分のインスタンスを使用して取得できます

WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration(context, builder) => {
    var configurationRoot = builder.build()
})

しかし、スタートアップで使用される構成を更新したいと思います。

では、IConfigurationRootを使用してStartupを取得し、サービスコレクションに挿入するにはどうすればよいですか?

9

Dealdiane's コメントに感謝します。

IConfigurationをダウンキャストできます:

public Startup(IConfiguration configuration)
{
    Configuration = (IConfigurationRoot)configuration;
}

public IConfigurationRoot Configuration { get; }

IConfigurationIConfigurationRootを保証しないため、これが意図した方法であるかどうかはまだわかりません。

14

または、Startupの初期化の前に注入できます。

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        IConfigurationRoot configurationRoot = null;
        return WebHost.CreateDefaultBuilder(args)
                 .ConfigureAppConfiguration((context, builder) =>
                  {
                      configurationRoot = builder.Build();
                  })
                  .ConfigureServices(services =>
                  {
                      services.AddSingleton<IConfigurationRoot>(configurationRoot);
                      services.AddSingleton<IConfiguration>(configurationRoot);
                  })
                 .UseStartup<Startup>();
    }
}
1
VahidN