Blazorにおける依存関係の注入(DI)【C# .NET】

BlazorにおけるDIとは何か

依存関係の注入(DI)とはStartup.csで構築したサービスにアクセスする手法
登録したサービスの定義はDIを通じて、Blazorページやアプリ全体で使うことができます。
この手法を使うことによって各Blazorページで毎回サービスを定義しなくても Startup.csを通じて利用することができます。なんと便利!

Blazorとは

.NET環境を利用して、Webアプリケーションの開発が行えるフレームワーク。

クライアント側もC#で開発が行えることが特徴です。
JavaScriptから相互運用を行うことができ、C#からJavaScriptのメソッドを呼び出すことができます。
>>公式ページはこち

ちなみに読み方は「ブレイザー」、古事記にもそう書かれている。

でも、どんなところで使うの?

どういった機能なのかはわかりました。
しかし、この機能を有効的に使える場面はどんなところなのかその一部を下記にまとめました。

  • DBへのアクセス
  • WebAPI
  • Razorページ間のやり取り
  • .NETメソッドからJavaScriptの呼び出し
  • …etc

カスタム認証機能を実装

カスタム認証を利用してページの閲覧制限などが行えます
カスタム認証 を実装するにはAuthenticationStateProviderを実装し、GetAuthenticationStateAsync をオーバーライドします。

public class ServerCustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
         .....
    }
}

後は、作成したAuthenticationStateProviderを継承したクラスをStartup.csにサービスとして登録をします。
ASP.NET CoreのDIに設定できるインスタンスの生成タイミングは以下の3種類存在し、利用するサービスによってタイミングを適切に設定する必要があります。

名称登録メソッド説明
TransientAddTransient()クラスのインスタンスが要求されると作成されます
ScopedAddScoped()1リクエストごとにインスタンスを生成します
SingletonAddSingleton()アプリケーション内で一つのインスタンスを生成し、そのあとは使いまわします
services.AddScoped<Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider, MyServerAuthenticationStateProvider>();

今回の認証機能では、リクエスト毎に確認が行いたいため Scoped/ AddScoped() を使用します。
Startup.cs

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddScoped<
    Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider, 
    MyServerAuthenticationStateProvider>();
...
}

ページの閲覧制限

Microsoft.AspNetCore.Components.AuthorizationをNuGetよりインストールをする。
その後ログインをしないと閲覧させたくないページに対して、[Authorize] 属性をrazorページに設定することで適用できます。

@page "/"
@attribute [Authorize]

<h1>Welcome to the site.</h1>

来週以降の投稿で他の認証サービスとの連携についても記載する予定です。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA