Blazor Server はデフォルトで、_Imports.razor に using を集約できるようになっていますが、

Injectを集約できる場所はデフォルトではありません。
Injectを集約するための基本クラスを作成し、各ページで @inherits から基本クラスを継承することで、Injectを集約できます。
ソースコードはGitHubで公開しています。


ソースコード構成
Blazor Server でCSVファイルをダウンロード をベースに、Injectの集約だけしています。
DownloadFile.razor画面のInjectが無くても、ファイルダウンロードできるをこと確認できます。


ソースコード変更内容を解説
Pages/Base/PageBase.razor
・今回は特に用途が無かったので、中身が空のファイルとしています。
Pages/Base/PageBase.razor.cs
・Injectのまとめ先、基本クラス。
・今回は、ファイルダウンロード用、画面遷移用、JavaScript実行用、それぞれのDI(Inject)を纏めています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using BlazorDownloadFile; namespace WebApplication1.Pages.Base {     partial class PageBase     {         [Inject] protected IBlazorDownloadFileService BlazorDownloadFileService { get; set; }         [Inject] protected NavigationManager _NavigationManager { get; set; }         [Inject] protected IJSRuntime JsRuntime { get; set; }     } } | 
Pages/DownloadFile.razor
・ファイルダウンロード処理をしている画面は、Injectが不要になったので削除し、inheritsで基本クラス(Base.PageBase)の継承を追加しています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | @page "/DownloadFile" @inherits Base.PageBase <h1>Download CSV File</h1> <button class="btn btn-primary" @onclick="DownloadExec">Text file download</button> @code {     private async Task DownloadExec()     {         var testCsvList = new List<TestCsv>();         testCsvList.Add(new TestCsv()         {             TestClm2 = "1111"         });         using (var memoryStream = new MemoryStream())         using (var writer = new StreamWriter(memoryStream, Encoding.UTF8))         using (var csv = new CsvWriter(writer, CultureInfo.CurrentCulture))         {             csv.WriteRecords(testCsvList);             writer.Flush();             var bytes = memoryStream.ToArray();             string filename = $"{DateTime.Now.ToString("yyyyMMddhhmmss")}.csv";             var result = await BlazorDownloadFileService.DownloadFile(filename, bytes, System.Net.Mime.MediaTypeNames.Application.Octet);         }     } } | 

 


コメント