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); } } } |
コメント