演習 - サービスを登録して使用する
ASP.NET Core アプリでは、複数のコンポーネント間で同じサービスにアクセスする必要がある場合がよくあります。 ASP.NET Core は、アプリで使用するサービスを管理するために、組み込みの依存関係挿入コンテナーを使用します。
チーム リーダーから、会社の最小限の Web サイトを作成する作業を任されました。 Web サイトでは、メイン ページにウェルカム メッセージを表示する必要があります。 あなたは、ウェルカム メッセージを生成するサービスを作成することにしました。 次に、サービスが必要なコンポーネントに挿入できるように、サービス コンテナーにサービスを登録します。
ASP.NET Core アプリを作成する
チームのアプリの役割を果たすには ASP.NET Core アプリが必要です。 Visual Studio Code の C# 開発キット拡張機能を使用して、新しい ASP.NET Core アプリを作成してみましょう。
Visual Studio Code を起動します。
Ctrl+Shift+P キーを押して、コマンド パレットを開きます。
[.NET: 新しいプロジェクト...] を選択します。
[ASP.NET Core (空)] を検索して選択します。
新しいプロジェクト用のフォルダーを選択または作成します。
新しいアプリに MyWebApp という名前を付けます。
[プロジェクトの作成] を選択し、プロジェクトを作成します。
新しいプロジェクトが開いたら、
Solution Explorerペインを展開してプロジェクト ファイルを表示します。
アプリを実行する
アプリをテストして、実行されることを確認します。
Visual Studio Code で、F5 キーを押してアプリをビルドおよび実行します。
- プロンプトが表示されたら、デバッガーとして [C#] を選択します。
- メッセージが表示されたら [C#: MyWebApp [既定の構成] を使用する起動構成として選択します。
このコマンドは、アプリを起動し、それをローカル Web サーバーでホストします。 ブラウザー ウィンドウが開き、"Hello, World!" と表示されます
ブラウザー ウィンドウを閉じ、Visual Studio Code で Shift+F5 キーを押してアプリを停止します。
サービスを作成する
これで、動作するアプリが完成したので、メイン ページのウェルカム メッセージを生成するサービスを作ってみましょう。
エクスプローラー ウィンドウで MyWebApp プロジェクトを右クリックします。 [ 新しいフォルダー] を選択します。 フォルダーに Services という名前を付けます。
Services フォルダー右クリックします。 [新しいファイル] を選択します。 ファイルにWelcomeService.csという名前を 付けます。
WelcomeService.cs の内容を次のコードに置き換えます。
namespace MyWebApp.Services; public class WelcomeService : IWelcomeService { DateTime _serviceCreated; Guid _serviceId; public WelcomeService() { _serviceCreated = DateTime.Now; _serviceId = Guid.NewGuid(); } public string GetWelcomeMessage() { return $"Welcome to Contoso! The current time is {_serviceCreated}. This service instance has an ID of {_serviceId}"; } }このコードでは、ウェルカム メッセージを生成する
WelcomeServiceメソッドを含むGetWelcomeMessageクラスが定義されます。 メッセージには、サービスが作成された現在時刻と、サービスの各インスタンスの一意識別子が含まれます。_serviceCreatedおよび_serviceIdフィールドはコンストラクターで設定され、サービス インスタンスの有効期間中は変更されないことに注意してください。
サービスを登録する
サービスができたので、それをサービス コンテナーに登録する必要があります。
Program.cs ファイルを開きます。
次の
`using` ディレクティブをファイルの先頭に追加します。using MyWebApp.Services;このディレクティブでは、
WelcomeServiceクラスへの参照が解決されます。行
var builder = WebApplication.CreateBuilder(args);のすぐ後ろに次のコードを追加します。builder.Services.AddSingleton<WelcomeService>();WebApplication.CreateBuilderは、WebApplicationBuilderというbuilderクラスの新しいインスタンスを作成します。 上記のコードでは、WelcomeServiceクラスを単一の有効期間でサービス コンテナーに登録しています。行
app.MapGet("/", () => "Hello World!");を次のコードに変更します。app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());このコードでは、ルート URL (
/) への HTTP GET 要求がWelcomeServiceサービスで生成されたウェルカム メッセージを返すデリゲートにマップされます。Program.cs ファイルは、次のようになります。
using MyWebApp.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<WelcomeService>(); var app = builder.Build(); app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); app.Run();
変更内容をテストする
- すべての変更を保存し、前と同様にアプリを実行します。
- ブラウザー ウィンドウが開いたら、ルート URL に
WelcomeServiceサービスで生成されたウェルカム メッセージが表示されることに注意してください。 - ブラウザー ウィンドウを閉じ、Visual Studio Code で Shift+F5 キーを押してアプリを停止します。
インターフェイスを使用する
チームがあなたのコードをレビューしたところ、別の開発者が、サービスの登録にインターフェイスを使用することを提案しました。
エクスプローラー ウィンドウで MyWebApp プロジェクトを右クリックします。 [ 新しいフォルダー] を選択します。 フォルダーにインターフェイスという名前を付けます。
[インターフェイス] フォルダーを右クリックします。 [新しいファイル] を選択します。 ファイルにIWelcomeService.csという名前を 付けます。
IWelcomeService.cs の内容を次のコードに置き換えます。
namespace MyWebApp.Interfaces public interface IWelcomeService { string GetWelcomeMessage(); }このコードでは
IWelcomeServiceインターフェイスとGetWelcomeMessageメソッドが定義されています。 このインターフェイスを実装するサービスは、GetWelcomeMessageメソッドの実装を提供する必要があります。Services/WelcomeService.cs ファイルを開きます。
次の
`using` ディレクティブをファイルの先頭に追加します。using MyWebApp.Interfaces;このディレクティブは、次の手順で追加した
IWelcomeServiceインターフェイスへの参照を解決します。WelcomeServiceインターフェイスを実装するようにIWelcomeServiceクラス宣言を更新します。public class WelcomeService : IWelcomeServiceWelcomeServiceインターフェイスを実装するために、IWelcomeServiceクラスに必要な変更はこれだけです。WelcomeServiceクラスには、GetWelcomeMessageインターフェイスのメソッド シグネチャに一致するIWelcomeServiceメソッドが既にあります。Program.cs ファイルを開きます。
行
builder.Services.AddSingleton<WelcomeService>();を次のコードに更新します。builder.Services.AddSingleton<IWelcomeService, WelcomeService>();このコードでは
WelcomeServiceクラスをIWelcomeServiceインターフェイスを使用するサービス コンテナーに登録します。ヒント
これは、"コンポーネントで
IWelcomeServiceが要求される場合は、WelcomeServiceのインスタンスを提供する" と言っているのだと考えてください。行
app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());を次のコードに更新します。app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());匿名関数では
IWelcomeServiceの代わりにWelcomeServiceが想定されるようになりました。Program.cs ファイルは、次のようになります。
using MyWebApp.Interfaces; using MyWebApp.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<IWelcomeService, WelcomeService>(); var app = builder.Build(); app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); app.Run();
変更内容をテストする
アプリが想定どおりに動くかテストしてみましょう。
- すべての変更を保存し、前と同様にアプリを実行します。
- ブラウザー ウィンドウが開いたら、ルート URL に
WelcomeServiceサービスで生成されたウェルカム メッセージが表示されることに注意してください。 - 次の演習のために、このアプリを実行したままにします。