ASP.NET Core Blazor dependency injection 之元件的存留期
在這篇文章所提到的專案原始碼,可以從 GitHub 下載
在這裡將會建立一個 Blazor 伺服器端的專案,並且在 Pages 資料夾下,建立一個 Blazor 元件 , DifferentInjection ,其程式碼如下:
@page "/DifferentInjection" @inherits OwningComponentBase<IMessageScoped>
@inject IMessageTransient messageTransient1 @inject IMessageTransient
messageTransient2 @inject IMessageScoped messageScoped1 @inject IMessageScoped
messageScoped2 @inject IMessageSingleton messageSingleton1 @inject
IMessageSingleton messageSingleton2
<h3>DifferentInjection</h3>
<div class="bg-info">
messageTransient1 的物件為 @messageTransient1.Hash()
</div>
<div class="bg-warning">
messageTransient2 的物件為 @messageTransient2.Hash()
</div>
<div class="bg-info">messageScoped1 的物件為 @messageScoped1.Hash()</div>
<div class="bg-warning">messageScoped1 的物件為 @messageScoped2.Hash()</div>
<div class="bg-info">
messageSingleton1 的物件為 @messageSingleton1.Hash()
</div>
<div class="bg-warning">
messageSingleton2 的物件為 @messageSingleton2.Hash()
</div>
<div />
<div class="btn btn-outline-danger">
messageTransient3 的物件為 @messageTransient3.Hash()
</div>
<div class="btn btn-outline-success">
messageScoped3 的物件為 @messageScoped3.Hash()
</div>
<div class="btn btn-outline-dark">
messageSingleton3 的物件為 @messageTransient3.Hash()
</div>
<div class="btn btn-outline-warning">
OwningComponentBase 的物件為 @Service.Hash()
</div>
@code { [Inject] public IMessageTransient messageTransient3 { get; set; }
[Inject] public IMessageScoped messageScoped3 { get; set; } [Inject] public
IMessageSingleton messageSingleton3 { get; set; } }</IMessageScoped
>
在上面使用了兩個新的注入技巧,一個是在最上面使用了
@inherits OwningComponentBase<IMessageSingleton>
語法,這樣將會使用了元件具範圍的方式來注入該物件,而且,一個頁面上僅能夠宣告一個,不能多個,這是為什麼呢?請大家思考看看。
另外一個注入物件的方式,那就是宣告一個屬性 Property,並且使用 Inject 屬性 Attribute 來標示建立的 C# Property,這樣也可以達到注入物件的效果,現在來看看執行效果:
這裡是第一次執行的結果
不論是使用
@inject
語法,或者使用 [inject]
attribute 屬性宣告方式,都可以達到注入物件的效果,而且所注入的物件,也都是按照當初註冊的存留期設定方式來表現;對於最後一個元件具範圍,需要使用 Service
這個變數來存取注入的物件,例如,在這裡是使用 @Service.Hash()
這樣的方式,而且從螢幕截圖的最下方可以看到(黃色底、黑色文字),這裡並沒有使用這次請求 Request 所使用的 Scoped 物件,而是獲得另外一個新的物件,雖然當初宣告的語法為 OwningComponentBase<IMessageScoped>
是要注入一個 Scoped 的物件,不過,這裡是享有 元件具範圍 Component Scoped 的特性。
底下為重新整理同一個網頁的執行結果
其中,因為產生一個新的 Request,所以,對於 Scoped 的存留期的注入,將會重新配置一個新的物件,並且不論使用哪種注入語法;對於 Singleton 的存留期注入,得到的還是同一個物件,與尚未整理前看到的相同。
更多關於 Blazor 教學影片,可以參考 Blazor 教學影片播放清單 或者 Blazor 快速體驗教學影片撥放清單。也歡迎訂閱本 .NET / Blazor / Xamarin.Forms 影片頻道 。
接續上篇文章 ASP.NET Core Blazor 在元件 Component 上的注入各種服務的存留期研究,實際進行 ASP.NET Core 中的三種存留期的注入使用方式與表現狀態,在這篇文章中,將來檢視 Blazor 中的 元件 Component Scoped 具範圍的行為表現。