演習 - サービスの有効期間を調べる
前の演習では、シングルトン サービスの有効期間を使用してサービスを登録しました。 コード レビューでは、チーム リーダーから 、シングルトン、 スコープ、 および一時的な サービスの有効期間の違いを調査するよう求められます。
シングルトン サービスの有効期間をテストする
アプリは、前の演習から引き続き実行中である必要があります。 実行中ではない場合は、前と同様にアプリを実行します。
ブラウザー ウィンドウを更新し、ウェルカム メッセージに表示される時刻をメモします。
数秒待ってから、ブラウザー ウィンドウをもう一度更新します。 ウェルカム メッセージは変わりません。 タイムスタンプと GUID はそのままです。
WelcomeServiceサービスがシングルトン サービスとして登録されているため、ウェルカム メッセージに表示される時刻と GUID は変わりません。 サービスはアプリの起動時に 1 回作成され、アプリの有効期間中に再利用されます。 すべてのクライアントからの要求は、サービスの同じインスタンスを使用します。 サービスの他のインスタンスは作成されません。Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。
スコープ付きサービスの有効期間をテストする
スコープ付きサービスの有効期間を理解するには、WelcomeService サービスの登録方法を変更する必要があります。
Program.cs ファイルで、スコープ付きサービスの有効期間を使用するように
WelcomeServiceサービスの登録を変更します。builder.Services.AddScoped<IWelcomeService, WelcomeService>();このコードは、
WelcomeServiceクラスをスコープ付きサービスの有効期間でサービス コンテナーに登録します。前と同様にアプリを実行します。
ウェルカム メッセージに表示される時刻と GUID に注意してください。 ブラウザー ウィンドウを更新し、時刻が毎回変わり、GUID が毎回異なっていることを確認します。
WelcomeServiceサービスがスコープ付きサービスとして登録されたため、ウェルカム メッセージに表示されるデータが変更されます。 サービスはクライアント要求ごとに 1 回作成され、要求が完了すると破棄されます。 すべてのクライアントからの要求は、サービスの新しいインスタンスを使用します。Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。
同じ要求で同じ
WelcomeServiceサービスの 2 つのインスタンスを使用しようとしたときの、スコープ付きサービスの有効期間の動作を調べてみましょう。 行app.MapGet()を次のコードに変更します。app.MapGet("/", async (IWelcomeService welcomeService1, IWelcomeService welcomeService2) => { string message1 = $"Message1: {welcomeService1.GetWelcomeMessage()}"; string message2 = $"Message2: {welcomeService2.GetWelcomeMessage()}"; return $"{message1}\n{message2}"; });上のコードでは以下の操作が行われます。
-
app.MapGet()デリゲートには、現在IWelcomeService型の 2 つのパラメーターがあります。 デリゲートは、各サービス インスタンスに対して 1 つずつ、2 つのウェルカム メッセージを生成します。 - デリゲートは、1 回の応答で両方のメッセージを返します。
-
前と同様にアプリを実行します。 2 つのウェルカム メッセージが異なる時刻に生成され、個別のパラメーターとしてデリゲートに渡された場合でも、メッセージは同一であることをご確認ください。
この動作は、
WelcomeServiceサービスが スコープ サービスとして登録されるためです。 サービスはクライアント要求ごとに 1 回作成され、同じ要求中にそのサービスを必要とするすべてのコンポーネントに同じインスタンスが提供されます。welcomeService1とwelcomeService2はどちらもWelcomeServiceサービスの同じインスタンスへの参照です。ページを数回更新します。 ウェルカム メッセージのタイムスタンプと GUID が毎回変更されますが、2 つのメッセージは常に同じであることをご確認ください。
Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。
トランジェント サービスの有効期間をテストする
次に、トランジェント サービスの有効期間を調べてみましょう。
WelcomeServiceサービスの登録を変更して、トランジェント サービスの有効期間を使用するようにします。builder.Services.AddTransient<IWelcomeService, WelcomeService>();このコードは、
WelcomeServiceクラスをトランジェント サービスの有効期間でサービス コンテナーに登録します。前と同様にアプリを実行します。
WelcomeServiceサービスの両方のインスタンスは同時に作成されるため、両方のメッセージの時刻はそのままです。 ただし、サービスのインスタンスはそれぞれ一意であるため、各メッセージの GUID は異なります。この動作は、トランジェント サービスの有効期間の特徴を示しています。 サービスがコンポーネントに注入されるたびに、新しいサービスのインスタンスが作成されます。 デリゲートに 2 回注入されるため、サービスのインスタンスが 2 つ作成されます。
ページを数回更新します。 ページを更新するたびに、タイムスタンプは両方のメッセージで常に同じですが、各メッセージの GUID は異なります。
Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。