概要
「メッセージは定数クラスではなくリソースファイル(.resx)ファイルで管理して」という依頼があったので、調査してみた。
リソースファイル(.resx)って、本来は多言語対応するために使用するらしい。
プロジェクトの構成
プロジェクトテンプレート:Blazor Web App
フレームワーク:.NET 8.0
Interactive render mode:Auto
Interactivity location:Per page/component
※本記事では@rendermode InteractiveServer
を指定した画面で検証を行った。
手順
①Microsoft.Extensions.Localizationをインストール
②Program.csに下記を追加
builder.Services.AddLocalization();
③プロジェクト直下にResourcesフォルダを追加
④Resourcesフォルダを右クリックしてSharedResources.resxを追加
⑤SharedResources.resxを右クリックして、「ファイルを開くアプリケーションの選択」
⑥管理対象リソースエディタ(レガシ)を選択→OK ※初回のみ、このエディタを使用
⑦アクセス修飾子をpublicに変更(重要)
※SharedResources.Designer.csが作成される
※ErrorMessageResourceNameからアクセス可能となる
⑧SharedResources.resxをダブルクリック(リソースエクスプローラーが開く)
⑨SharedResources.resxを編集する
名前:Greeting ※リソースのキー
ニュートラル値:Hello World ※リソースの値
⑩_Imports.razor.csに下記を記載
@using Microsoft.Extensions.Localization
@using AzRefArc.AspNetBlazorUnited.Resources
⑪razorファイルからresxを参照
@inject IStringLocalizer<SharedResources> Loc ※SharedResourcesはSharedResources.Designer.cs内に定義されたクラス
@Loc["Greeting"]
⑫アノテーションからresxを参照
@using プロジェクトのルート名前空間.Resources;
[Required(ErrorMessageResourceName = "Greeting", ErrorMessageResourceType = typeof(SharedResources))]
⑬リソースキーの定数化
下記のようにリソースのキーを定数化すると保守しやすそう。
リソースファイルを扱ってる記事をいくつか読んだ感じ、リソースのキーを定数化については何も言及されてなかった。自分の感覚では定数化するべきかなと思う。リファクタリングしやすいし、タイピングミスが起こらないし。
public static class ResourceKeys
{
public const string RequiredError = "RequiredError";
}
参考