1. ホーム
  2. Web プログラミング
  3. ASP.NET
  4. 基本的なアプリケーション

NET 6の新しい設定オブジェクトConfigurationManagerの紹介

2022-01-13 14:52:35

はじめに

このセクションでは NET 6 新しい ConfigurationManager なぜこのような話をする必要があるのか、設定情報の読み取りと読み込みはすべてこれに付随している、と多くの人が思っていることでしょう。

翻訳です。これは、ASP.NET Coreの新しい WebApplcation WebApplicationBuilder の型を使用し、設定からその型を使用できるようにします (例 appsettings.json DOTNET_/ASPNETCORE_ 環境変数) を使用しながらも、明示的に設定を再構築することなく新しい設定ソースを追加することができます。を渡すたびに IConfigurationBuilder インターフェイスを使用して、ソース IConfiguration は直ちに自動更新されます。

レビュー履歴

を使用しています。 NET 5 で開発する場合 IConfigurationBuilder を使って設定ソースを追加します。の呼び出しは Build() ビルダーは各コンフィギュレーションソースを読み込んで、最終的なコンフィギュレーションを構築する IConfigurationRoot .

private static IConfigurationRoot BuildConfiguration()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), ". /MyProjectName.DbMigrator/"))
                .AddJsonFile("appsettings.json", optional: false);

            return builder.Build();
        }

もちろん、私たちの通常のシステム開発では、基本的に ConfigurationBuilder を呼び出したり Build() これは、.NET の下部ですべて行われます。

では、このタイプの展開のポイントは何でしょうか?

栗として 非AzureホストアプリにアプリケーションIDとX.509証明書を使う、これはMicrosoftから与えられた公式ケースです。Azure Key Vaultプロバイダを設定するには設定値が必要なので説明すると、鶏が先か卵が先か?-- 構成を構築するまでは、構成ソースを追加することはできませんよ。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            if (context.HostingEnvironment.IsProduction())
            {
                var builtConfig = config;

                using var store = new X509Store(StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);
                var certs = store.Certificates.Find(
                    X509FindType.FindByThumbprint,
                    builtConfig["AzureADCertThumbprint"], false);

                config.AddAzureKeyVault(new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"),
                                        new ClientCertificateCredential(builtConfig["AzureADDirectoryId"], builtConfig["AzureADApplicationId"], certs. OfType<X509Certificate2>().Single()),
                                        new KeyVaultSecretManager());

                store.Close();
            }
        })
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());

私たちの歩みは

  1. 設定の初期化
  2. IConfigurationBuilder.Build()を呼び出してコンフィギュレーションを構築します。
  3. IConfigurationRootから必要な設定値を取得する
  4. コンフィグレーションのソースを追加する
  5. フレームワークは Build() を呼び出して、最終的なアプリケーションの設定を生成します。

ここでは Build() を2回使用することになりますが、どのような問題が発生するのでしょうか?

ConfigurationBuilder.Build() 各呼び出しは、すべてのソースを反復し、プロバイダをロードし、新しいインスタンスを生成します。 ConfigurationRoot . 皆さんは、ファイルを読むのに必要な消費を理解しているはずです。

新しい実装

を使用しています。 ConfigurationManager を指定すると IConfigurationSource が追加されます。 AddJsonFile() を呼び出すと、プロバイダはすぐにそれをロードして設定を更新します。

 using var config = new ConfigurationManager();

    config.AddEnvironmentVariables(prefix: "MyCustomPrefix_");

    if (config["FileConfig"] == "enabled")
    {
        config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true);
    } 

    string myValueFromJson = config["JsonConfigValue"];


public class ConfigurationManager
{

    private void AddSource(IConfigurationSource source)
    {
        lock (_providerLock)
        {
            IConfigurationProvider provider = source.Build(this);
            _providers.Add(provider);

            provider.Load();
            _changeTokenRegistrations.Add(ChangeToken.OnChange(() => provider.GetReloadToken(), () => RaiseChanged())));
        }

        RaiseChanged();
    }
}


private void ReloadSources()
{
    lock (_providerLock)
    {
        DisposeRegistrationsAndProvidersUnsynchronized();

        _changeTokenRegistrations.Clear();
        Clear(); _providers.Clear();

        foreach (var source in _sources)
        {
            _providers.Add(source.Build(this));
        }

        foreach (var p in _providers)
        {
            p.Load();
            _changeTokenRegistrations.Add(ChangeToken.OnChange(() => p.GetReloadToken(), () => RaiseChanged())));
        }
    }

    RaiseChanged();
}

注意事項 ConfigurationManager なぜなら、ソースを変更したらすべて削除し、各ソースを走査して再読み込みしてやり直さなければならないからです。もし、設定ソースの操作を多く行うのであれば、その際に ConfigurationManager は逆効果になります。

ConfigurationManager パーシャルビルドとフルビルドの設定に使用します。

結論

.NETを使用する場合は気にしないでください。 ConfigurationManager または ConfigurationBuilder ロードスキームを使い分けるには、開発時に必要に応じて使い分けるのが一番です。

今回の記事は以上です。Scripting Houseの学習とサポートに役立てば幸いです。