NET 6の新しい設定オブジェクトConfigurationManagerの紹介
はじめに
このセクションでは
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>());
私たちの歩みは
- 設定の初期化
- IConfigurationBuilder.Build()を呼び出してコンフィギュレーションを構築します。
- IConfigurationRootから必要な設定値を取得する
- コンフィグレーションのソースを追加する
- フレームワークは 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の学習とサポートに役立てば幸いです。
関連
-
ASP.NET Core 6で依存関係を解決する3つの方法
-
pythonでpillowをインストールする3つの方法
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
Net Core HttpClient処理 レスポンス圧縮の詳細
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
Application_End イベントをブロックする解決策
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン