2019年12月11日 星期三

ASP.NET Core Blazor dependency injection 之元件的存留期

ASP.NET Core Blazor dependency injection 之元件的存留期

更多關於 Blazor 教學影片,可以參考 Blazor 教學影片播放清單 或者 Blazor 快速體驗教學影片撥放清單。也歡迎訂閱本 .NET / Blazor / Xamarin.Forms 影片頻道 。


接續上篇文章 ASP.NET Core Blazor 在元件 Component 上的注入各種服務的存留期研究,實際進行 ASP.NET Core 中的三種存留期的注入使用方式與表現狀態,在這篇文章中,將來檢視 Blazor 中的 元件 Component Scoped 具範圍的行為表現。
在這篇文章所提到的專案原始碼,可以從 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 的存留期注入,得到的還是同一個物件,與尚未整理前看到的相同。




沒有留言:

張貼留言