Blog
ASP.NETCoreでのアプリケーション構成
By Sean G. Wright
ASP.NET Coreは、開発者がWebアプリケーションに柔軟な構成を追加するための特定の方法を提供します。さまざまな構成例と、KenticoXperienceがプロジェクトにどのように役立つかをご覧ください。
ソフトウェア開発では、アプリケーション構成により、アプリケーション自体を変更することなく、アプリケーションの動作方法を変更できます。
構成ソースは、ファイル、アプリケーションメモリ、データベースなど、すべてのプラットフォームとフレームワークでほぼ同じですが、構成を定義してアクセスする方法は、プラットフォームとフレームワークに固有です。
したがって、 ASP.NET Coreが、開発者がWebアプリケーションに柔軟な構成を追加するための特定の方法を提供するのは当然のことです。
構成にファイルを使用する
appsettings.json
.NET Framework上のASP.NETと同様に、ASP.NET Coreは、アプリケーションのニーズの変化と拡大に応じて拡張できる構成のいくつかの規則から始まります。
従来のASP.NETアプリケーションは、構成の主要なソースとして、 「web.config」で始まるXMLで記述された「.config」ファイルを使用していました。この構成の一部は、ASP.NET Coreでコードに移行しましたが(XMLで登録されたHttpHandlerとHttpModuleの代わりにミドルウェアなど)、ほとんどの構成はファイルからのものであり、主な違いはファイルの構文です。
JSONファイル、特に`appsettings.json`は、XMLベースの` web.config`ファイルに取って代わりました。
IConfigurationの使用
この `appsettings.json`ファイルに追加されたキーと値のペアは、依存性注入を使用して` IConfiguration`サービスを使用してアプリケーションのどこからでもアクセスできます。
具体的な例を見てみましょう!
次のように、 ASP.NETCoreアプリケーションで `appsettings.json`ファイルを取得します。
{ '挨拶' :{ '朝' : 'おはよう' 、 '午後' : 'おはよう' 、 '夜' : 'おやすみ' }、 'greetingTimes' :{ '朝' : '6:00' 、 '午後 ' : ' 12:00 ' 、 '夜 ' : ' 18:00 ' } }
`IConfiguration`サービスを使用して、コントローラーの構成値にアクセスできます。
public class HomeController : Controller { private readonly IConfiguration config ; public HomeController (IConfiguration config ) {これ。 config = config ; } public ActionResult Index (文字列名) {文字列morningGreeting = config [ 'greetings:morning' ]; string personalizedGreeting = $ '{morningGreeting}、{name}' ; // ... } }
ネストされた構成値にアクセスできる`greetings:morning`構文に注目してください。
構成の「挨拶」セクション全体を取得することもできます。
IConfigurationSection Greetings = config.GetSection( 'greetings' ) ; string nightGreeting = Greetings [ 'night' ] ;
`IConfiguration`サービスには別のメソッド` .GetValue
IConfigurationSection Greetings = config.GetSection( 'greetings' ); IConfigurationSection times = config.GetSection( 'greetingTimes' ); TimeSpan朝= times.GetValue ( '朝' ); TimeSpan午後= times.GetValue >( '午後' ); TimeSpan night = times.GetValue ( 'night' ); TimeSpan now = DateTime.Now.TimeOfDay; if (now <朝||今> =夜) {挨拶を返す['夜' ]; } else if(現在<午後) {挨拶を返す['朝' ]; } else if(now { return Greetings [ 'afternoon' ]; }
これらの単純な構成例は一部のアプリケーションで機能しますが、ASP.NETCoreは複雑なアプリケーションもサポートしています。
構成プロバイダー
ASP.NETCoreに移行するASP.NET.NET Frameworkアプリケーションがある場合、 `.json`ファイル以外のソースから多くの構成が行われる可能性があります。
幸い、ASP.NET Coreは、他にもいくつかの構成プロバイダーを提供しています。
それはかなり網羅的なリストです!ただし、アプリケーションは、上記のプロバイダーでカバーされていないソースから構成を読み取る必要がある場合があります。これらのシナリオには、 カスタム構成プロバイダーがあります。
アプリケーションの構成は、構成プロバイダーを持たないクラウドオファリングに保存されている可能性があります。あるいは、おそらく、データベースに構成値を保存している可能性があります。
これらのシナリオのいずれについても、 `IDictionary
この構成プロバイダーは、アプリケーションの起動時に、アプリケーション構成のソースとして追加されたカスタム構成ソース(これも当社が作成)によって使用されます。
オプションパターン
アプリケーションが内部機能と外部統合の両方で成長するにつれて、必然的にさらに多くの構成が必要になります。
- データベース接続文字列
- WebサービスAPIキー
- 電子メールSMTP資格情報
- ファイルシステムパス
ただし、アプリケーションの各部分は、必要な構成にのみアクセスできる必要があり、すべての構成ソースのすべての機能のすべての値にアクセスできるわけではありません。
ありがたいことに、ASP.NET Coreは、 オプションパターンで役立つ抽象化を提供します。
オプションを使用すると、開発者は、構成を保持する単純なC#クラスと、アプリケーションの`IConfiguration`からそれらのクラスにデータを入力するプロセスを定義できます。これは、Optionsパターンを採用すると、依存関係として `IConfiguration`を渡すことを回避し、構成が検証され、強く型付けされることを保証できることを意味します。
前の挨拶の例でオプションを使用する方法を見てみましょう。
まず、特定の構成値を保持するC#クラスを定義します(便宜上、C#9.0レコードタイプを使用しています)。
公記録GreetingConfiguration ( GreetingSettings朝、 GreetingSettings午後、 GreetingSettings Night ) {} パブリックレコードGreetingSettings (文字列Greeting、TimeSpan Time) {}
次に、アプリケーションの起動時に、 `GreetingConfiguration`をオプションとして定義し、その作成方法を説明します。
パブリッククラスのスタートアップ{ パブリックスタートアップ(IConfiguration構成) {構成=構成; } public IConfiguration Configuration { get ; } public void ConfigureServices (IServiceCollectionサービス) { services.AddOptions ()。 Configure(greetingConfig => { IConfigurationSection Greetings = config .GetSection( 'greetings' ); IConfigurationSection times = config .GetSection( 'greetingTimes' ); TimeSpan朝= times.GetValue ( '朝' ); TimeSpan午後= times.GetValue ( '午後' ); TimeSpan night = times.GetValue ( 'night' ); 新しいGreetingConfiguration( new GreetingSettings(greetings [ 'morning' ]、morning)、 new GreetingSettings(greetings [ 'afternoon' ]、午後)、 new GreetingSettings(greetings [ 'night' ]、night)、 );を返します。 }); // ... } }
これで、 `IOptions
パブリッククラスGreetingController :コントローラー{プライベート読み取り専用GreetingConfigurationグリーティング; public GreetingController ( IOptions Greetings ) { this .greetings = Greetings.Value; } public ActionResult Index ( ) { // C#9.0レコードの破棄! ((文字列morningGreeting、TimeSpanmorningTime)、_、_)=挨拶; // ... } }
その他の興味深いユースケースは、 IOptionsSnapshotで有効になります。これにより、リクエストごとにオプションが再作成され、最新の値が確実に得られます。これは、構成がデータベースまたはWebサービスからのものである場合に役立ちます。
IOptionsMonitorを使用することもできます。これにより、データソースが変更されるたびにオプションを再作成できます。
KenticoXperienceの構成
私たちが見た構成例のいくつかは( `IConfiguration`を使用して)単純ですが、他の例ははるかに複雑です(カスタムの` IConfigurationProvider`または`IOptionsMonitor` )。
では、データベースとファイルシステムの両方から構成を取得するデータ駆動型アプリケーションであるKentico Xperience 13.0を使用する場合、構成値を初期化してアクセスするにはどうすればよいでしょうか。
ありがたいことに、それはかなり簡単です!
まず、Kentico Xperienceをアプリケーションの起動時に登録して、アプリケーションに統合していることを確認します。
パブリッククラスのスタートアップ{ パブリックスタートアップ(IConfiguration構成) {構成=構成; } public IConfiguration Configuration { get ; } public void ConfigureServices (IServiceCollectionサービス) { services.AddKentico(); // ... } }
XperienceはASP.NETCoreの規則に従い、 `appsettings.json`で構成を検索するため、必要なのは構成キーを参照してカスタム値を指定することだけです。 Xperienceが実行を開始するために必要なすべての構成は、自動的に接続されます。
しかし、データベース構成はどうですか?
Xperienceは、単一の`services.AddKentico();`呼び出しを使用して、依存性注入を介してアプリケーションで自動的に使用できる`ISettingsService`インターフェースを使用して、これも簡単にします。
これが完了すると、 `ISettingsService`を直接使用できます(または、上記のオプションパターンを使用したオプションのデータソースとして)。
パブリッククラスHomeController :コントローラー{ プライベート読み取り専用ISettingsService設定 public HomeController ( ISettingsService settings ) { this .settings = settings; } public ActionResult Index ( ) {文字列の挨拶=設定[ 'SiteGreeting' ]; // ... } }
ご覧のとおり、Kentico Xperienceは、アプリケーションの構築を迅速に開始し、要件の増大に応じて複雑さを管理するために必要なビルディングブロックを提供します。