簡體   English   中英

Blazor 級聯參數與 singleton 依賴注入

[英]Blazor CascadingParameter vs singleton DependencyInjection

我最近了解到,您可以通過將Router組件包裝在提供程序Microsoft doc中來為整個項目提供 cascadingValues。 這與使用 singleton 模式的依賴注入有何不同? (我知道注入是如何工作的,我的意思是性能和架構方面)

你覺得哪個更好用?

關於 CascadingValues 的性能影響已經有一些討論。 我可以推薦這篇文章(它也是一個很好的教程)。

正如您所提到的,有兩個方面:性能和架構。

表現

我會看到[CascadingParameter][Parameter]或“普通”字段和屬性相比成本高昂。 樹下的每個組件,訂閱[CascadingParameter]更改。 如果值發生變化,則啟動新的ParamtersSet循環,這可能會導致調用渲染樹並檢查 DOM 中的某些內容是否需要更改。 因此,即使不需要重新渲染,得出這個結論的過程也會消耗時間。 組件越多,樹的深度越大,這個過程就越慢。

建築學

為了討論這個方面,我們可以考慮CascadingAuthenticationState 它是 Blazor 身份驗證框架的一部分,並提供檢查用戶是否通過身份驗證的訪問權限。 它被實現為級聯值,而不是 singleton。 樹下的組件(如菜單)可以輕松地使用此值來隱藏/顯示未經過身份驗證的用戶的項目。 為什么?

更改頻率和對 DOM 的影響

要回答的問題是關於級聯值變化的影響。 如果用戶登錄/注銷,可以合理地假設這將觸發巨大的 DOM 更改。 因此,檢查樹的很大一部分(如果不是基於級聯值放置位置的全部)不是開銷。

此外,可以很好地猜測AuthenticationState在應用程序的生命周期內幾乎不會發生變化。

簡單

菜單組件使用AuthorizeView ,它使用Task<AuthenticationState>的級聯參數。

<AuthorizeView>
    <Authorized>
        <li><a href="/admin">Admin</a></li>
    </Authorized>
    <NotAuthorized>
        <li><a href="authentication/login">Log in</a></li>
    </NotAuthorized>
</AuthorizeView>

這個片段很容易閱讀,你可以很快理解它。 如果您對 singleton 服務執行相同操作,則需要實現組件和服務之間的“通信”。 最好實現訂閱/取消訂閱場景,可能使用事件或更高級的技術。 您將需要編寫自己的代碼,並且再次不要忘記編寫IDisposable的實現來取消訂閱。

級聯參數側重於 UI

雖然 singleton 服務是解決許多不同問題的非常通用的方法,但級聯值專門用於解決 UI 更新問題。 他們做得非常有效。 AuthenticationState的情況下,它使用專門的視圖。

如果 Blazor 不僅僅與 UI 有關,但具有現代、豐富功能的 GUI,有時我們在應用程序內部有分層方法,則 arguments 有空間。 因此,對於 UI,我指的是應用程序中最終負責渲染的部分。

服務可以在這個內部 UI 層之外,通過整個應用程序使用,然后在 UI 中也可以重用,而級聯參數只能在組件內部使用。

級聯參數是(主要是一種方式)

級聯參數由組件“擁有”。 通常是聲明它的組件。 從那時起,它被傳遞到樹上。 所有其他組件都可以使用它。 沒有直接、簡單且可擴展的方法來更新子組件的值。 正如我所說,大多數情況下,有辦法做到這一點,但在我看來,這是一條骯臟的道路。

概括

與許多其他技術一樣,答案是:這取決於用例。

自上而下的用法:級聯值

組件需要更新值:服務

許多變化:如果容易超過性能影響,它高度依賴於樹結構。

在內部 UI 層內外使用:服務

並且,解決此問題的另一種方法可能是Blazor 組件總線

更新

除了 Just the benno 所說的之外,我還可以補充一點,CascadingValue 組件和 Singleton 服務在 scope 方面存在根本區別。 Singleton 服務,在 Blazor 服務器應用程序中,是 singleton 整個應用程序的生命周期,跨多個連接,跨多個瀏覽器...而您的 app.current 組件的范圍為更改 CascadingValue 組件提供的 object 的 state 對應用程序的新實例沒有影響。 但是,如果您在應用程序實例中更改 Singleton 服務的 state,則此更改將傳播到應用程序的其他實例。 嘗試想象將 CascadingAuthenticationState 組件的功能實現為 Singleton 服務而不是 CascadingValue 會產生什么影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM