演習 - サービスの有効期間を調べる

完了

前の演習では、シングルトン サービスの有効期間を使用してサービスを登録しました。 コード レビューでは、チーム リーダーから 、シングルトンスコープおよび一時的な サービスの有効期間の違いを調査するよう求められます。

シングルトン サービスの有効期間をテストする

  1. アプリは、前の演習から引き続き実行中である必要があります。 実行中ではない場合は、前と同様にアプリを実行します。

  2. ブラウザー ウィンドウを更新し、ウェルカム メッセージに表示される時刻をメモします。

  3. 数秒待ってから、ブラウザー ウィンドウをもう一度更新します。 ウェルカム メッセージは変わりません。 タイムスタンプと GUID はそのままです。

    WelcomeService サービスがシングルトン サービスとして登録されているため、ウェルカム メッセージに表示される時刻と GUID は変わりません。 サービスはアプリの起動時に 1 回作成され、アプリの有効期間中に再利用されます。 すべてのクライアントからの要求は、サービスの同じインスタンスを使用します。 サービスの他のインスタンスは作成されません。

  4. Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。

スコープ付きサービスの有効期間をテストする

スコープ付きサービスの有効期間を理解するには、WelcomeService サービスの登録方法を変更する必要があります。

  1. Program.cs ファイルで、スコープ付きサービスの有効期間を使用するようにWelcomeService サービスの登録を変更します。

    builder.Services.AddScoped<IWelcomeService, WelcomeService>();
    

    このコードは、WelcomeService クラスをスコープ付きサービスの有効期間でサービス コンテナーに登録します。

  2. 前と同様にアプリを実行します。

  3. ウェルカム メッセージに表示される時刻と GUID に注意してください。 ブラウザー ウィンドウを更新し、時刻が毎回変わり、GUID が毎回異なっていることを確認します。

    WelcomeService サービスがスコープ付きサービスとして登録されたため、ウェルカム メッセージに表示されるデータが変更されます。 サービスはクライアント要求ごとに 1 回作成され、要求が完了すると破棄されます。 すべてのクライアントからの要求は、サービスの新しいインスタンスを使用します。

  4. Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。

  5. 同じ要求で同じ 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 回の応答で両方のメッセージを返します。
  6. 前と同様にアプリを実行します。 2 つのウェルカム メッセージが異なる時刻に生成され、個別のパラメーターとしてデリゲートに渡された場合でも、メッセージは同一であることをご確認ください。

    この動作は、 WelcomeService サービスが スコープ サービスとして登録されるためです。 サービスはクライアント要求ごとに 1 回作成され、同じ要求中にそのサービスを必要とするすべてのコンポーネントに同じインスタンスが提供されます。 welcomeService1welcomeService2 はどちらも WelcomeService サービスの同じインスタンスへの参照です。

  7. ページを数回更新します。 ウェルカム メッセージのタイムスタンプと GUID が毎回変更されますが、2 つのメッセージは常に同じであることをご確認ください。

  8. Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。

トランジェント サービスの有効期間をテストする

次に、トランジェント サービスの有効期間を調べてみましょう。

  1. WelcomeService サービスの登録を変更して、トランジェント サービスの有効期間を使用するようにします。

    builder.Services.AddTransient<IWelcomeService, WelcomeService>();
    

    このコードは、WelcomeService クラスをトランジェント サービスの有効期間でサービス コンテナーに登録します。

  2. 前と同様にアプリを実行します。 WelcomeService サービスの両方のインスタンスは同時に作成されるため、両方のメッセージの時刻はそのままです。 ただし、サービスのインスタンスはそれぞれ一意であるため、各メッセージの GUID は異なります。

    この動作は、トランジェント サービスの有効期間の特徴を示しています。 サービスがコンポーネントに注入されるたびに、新しいサービスのインスタンスが作成されます。 デリゲートに 2 回注入されるため、サービスのインスタンスが 2 つ作成されます。

  3. ページを数回更新します。 ページを更新するたびに、タイムスタンプは両方のメッセージで常に同じですが、各メッセージの GUID は異なります。

  4. Visual Studio Code で Shift キーを押しながら F5 キーを押して、アプリを停止します。