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種類存在し、利用するサービスによってタイミングを適切に設定する必要があります。
名称 | 登録メソッド | 説明 |
Transient | AddTransient() | クラスのインスタンスが要求されると作成されます |
Scoped | AddScoped() | 1リクエストごとにインスタンスを生成します |
Singleton | AddSingleton() | アプリケーション内で一つのインスタンスを生成し、そのあとは使いまわします |
今回の認証機能では、リクエスト毎に確認が行いたいため 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>