演習 - サービスを登録して使用する

完了

ASP.NET Core アプリでは、複数のコンポーネント間で同じサービスにアクセスする必要がある場合がよくあります。 ASP.NET Core は、アプリで使用するサービスを管理するために、組み込みの依存関係挿入コンテナーを使用します。

チーム リーダーから、会社の最小限の Web サイトを作成する作業を任されました。 Web サイトでは、メイン ページにウェルカム メッセージを表示する必要があります。 あなたは、ウェルカム メッセージを生成するサービスを作成することにしました。 次に、サービスが必要なコンポーネントに挿入できるように、サービス コンテナーにサービスを登録します。

ASP.NET Core アプリを作成する

チームのアプリの役割を果たすには ASP.NET Core アプリが必要です。 Visual Studio Code の C# 開発キット拡張機能を使用して、新しい ASP.NET Core アプリを作成してみましょう。

  1. Visual Studio Code を起動します。

  2. Ctrl+Shift+P キーを押して、コマンド パレットを開きます。

  3. [.NET: 新しいプロジェクト...] を選択します。

  4. [ASP.NET Core (空)] を検索して選択します。

    [ASP.NET Core (空)] が選択されているコマンド パレットのスクリーンショット。

  5. 新しいプロジェクト用のフォルダーを選択または作成します。

  6. 新しいアプリに MyWebApp という名前を付けます。

  7. [プロジェクトの作成] を選択し、プロジェクトを作成します。

  8. 新しいプロジェクトが開いたら、Solution Explorer ペインを展開してプロジェクト ファイルを表示します。

    Visual Studio Code の [ソリューション エクスプローラー] ペインのスクリーンショット。

アプリを実行する

アプリをテストして、実行されることを確認します。

  1. Visual Studio Code で、F5 キーを押してアプリをビルドおよび実行します。

    1. プロンプトが表示されたら、デバッガーとして [C#] を選択します。
    2. メッセージが表示されたら [C#: MyWebApp [既定の構成] を使用する起動構成として選択します。

    このコマンドは、アプリを起動し、それをローカル Web サーバーでホストします。 ブラウザー ウィンドウが開き、"Hello, World!" と表示されます

  2. ブラウザー ウィンドウを閉じ、Visual Studio Code で Shift+F5 キーを押してアプリを停止します。

サービスを作成する

これで、動作するアプリが完成したので、メイン ページのウェルカム メッセージを生成するサービスを作ってみましょう。

  1. エクスプローラー ウィンドウで MyWebApp プロジェクトを右クリックします。 [ 新しいフォルダー] を選択します。 フォルダーに Services という名前を付けます。

  2. Services フォルダー右クリックします。 [新しいファイル] を選択します。 ファイルにWelcomeService.csという名前を 付けます

  3. 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 フィールドはコンストラクターで設定され、サービス インスタンスの有効期間中は変更されないことに注意してください。

サービスを登録する

サービスができたので、それをサービス コンテナーに登録する必要があります。

  1. Program.cs ファイルを開きます。

  2. 次の `using` ディレクティブをファイルの先頭に追加します。

    using MyWebApp.Services;
    

    このディレクティブでは、WelcomeService クラスへの参照が解決されます。

  3. var builder = WebApplication.CreateBuilder(args); のすぐ後ろに次のコードを追加します。

    builder.Services.AddSingleton<WelcomeService>();
    

    WebApplication.CreateBuilder は、WebApplicationBuilder という builder クラスの新しいインスタンスを作成します。 上記のコードでは、WelcomeService クラスを単一の有効期間でサービス コンテナーに登録しています。

  4. 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();
    

変更内容をテストする

  1. すべての変更を保存し、前と同様にアプリを実行します。
  2. ブラウザー ウィンドウが開いたら、ルート URL に WelcomeService サービスで生成されたウェルカム メッセージが表示されることに注意してください。
  3. ブラウザー ウィンドウを閉じ、Visual Studio Code で Shift+F5 キーを押してアプリを停止します。

インターフェイスを使用する

チームがあなたのコードをレビューしたところ、別の開発者が、サービスの登録にインターフェイスを使用することを提案しました。

  1. エクスプローラー ウィンドウで MyWebApp プロジェクトを右クリックします。 [ 新しいフォルダー] を選択します。 フォルダーにインターフェイスという名前を付けます。

  2. [インターフェイス] フォルダーを右クリックします。 [新しいファイル] を選択します。 ファイルにIWelcomeService.csという名前を 付けます

  3. IWelcomeService.cs の内容を次のコードに置き換えます。

    namespace MyWebApp.Interfaces
    
    public interface IWelcomeService
    {
        string GetWelcomeMessage();
    }
    

    このコードでは IWelcomeService インターフェイスと GetWelcomeMessage メソッドが定義されています。 このインターフェイスを実装するサービスは、GetWelcomeMessage メソッドの実装を提供する必要があります。

  4. Services/WelcomeService.cs ファイルを開きます。

  5. 次の `using` ディレクティブをファイルの先頭に追加します。

    using MyWebApp.Interfaces;
    

    このディレクティブは、次の手順で追加した IWelcomeService インターフェイスへの参照を解決します。

  6. WelcomeService インターフェイスを実装するように IWelcomeService クラス宣言を更新します。

    public class WelcomeService : IWelcomeService
    

    WelcomeService インターフェイスを実装するために、IWelcomeService クラスに必要な変更はこれだけです。 WelcomeService クラスには、GetWelcomeMessage インターフェイスのメソッド シグネチャに一致する IWelcomeService メソッドが既にあります。

  7. Program.cs ファイルを開きます。

  8. builder.Services.AddSingleton<WelcomeService>(); を次のコードに更新します。

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

    このコードでは WelcomeService クラスを IWelcomeService インターフェイスを使用するサービス コンテナーに登録します。

    ヒント

    これは、"コンポーネントで IWelcomeService が要求される場合は、WelcomeService のインスタンスを提供する" と言っているのだと考えてください。

  9. 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();
    

変更内容をテストする

アプリが想定どおりに動くかテストしてみましょう。

  1. すべての変更を保存し、前と同様にアプリを実行します。
  2. ブラウザー ウィンドウが開いたら、ルート URL に WelcomeService サービスで生成されたウェルカム メッセージが表示されることに注意してください。
  3. 次の演習のために、このアプリを実行したままにします。