Blazor University (51)依賴注入 —— 擁有多個依賴項:錯誤的方式

原文鏈接:https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/

擁有多個依賴項:錯誤的方式

`OwningComponentBase`[1] 類是一個合適的解決方案,當我們需要我們的組件只擁有一個獨立的依賴實例(以及它所依賴的任何 Scoped/Transient 依賴)時。但是,有時我們需要我們的組件擁有多個依賴項。

本節將演示實現此目標的錯誤方法,然后下一節將演示如何正確實現它。

概述

源代碼[2]

使用 OwningComponentBase<T> 時要記住的是,只有在組件擁有的注入容器中創建的 T(存儲在名為 Service 的屬性中)。

OwningComponentBase<T> 的派生類上使用 @inject 指令將不會從組件自己的注入容器中注入依賴項。

注意: 如果您還沒有這樣做,如果您還不熟悉此類如何創建自己的注入容器,請閱讀有關 OwningComponentBase[3] 的部分。

示例

對于本練習,我們將創建一個新的 Blazor 應用程序,該應用程序將演示通過 OwningComponentBase<T> 中的 T@inject 指令為我們的組件提供的服務的不同生命周期。

首先,創建一個新項目,并添加以下服務。

public?interface?IOwnedDependency
{public?int?InstanceNumber?{?get;?}
}public?class?OwnedDependency?:?IDependencyOne
{private?static?volatile?int?PreviousInstanceNumber;public?int?InstanceNumber?{?get;?}public?OwnedDependency(){InstanceNumber?=System.Threading.Interlocked.Increment(ref?PreviousInstanceNumber);}
}

該類只是根據增加一個靜態字段為自己分配一個新的 InstanceNumber,為每個實例提供一個序號。

接下來,使用名稱 InjectedDependency 創建一段相同的代碼并注冊服務。

//?Server-side?apps,?edit?Startup.cs
services.AddScoped<IOwnedDependency,?OwnedDependency>();
services.AddScoped<IInjectedDependency,?InjectedDependency>();//?WebAssembly?apps,?edit?Program.cs
builder.Services.AddScoped<IOwnedDependency,?OwnedDependency>();
builder.Services.AddScoped<IInjectedDependency,?InjectedDependency>();

使用依賴

現在在 /Shared 文件夾中創建一個名為 MyOwningComponent 的組件,如下所示:

@inherits?OwningComponentBase<IOwnedDependency>
@inject?IInjectedDependency?InjectedDependency<div>Service.InstanceNumber?=?@Service.InstanceNumber
</div>
<div>InjectedDependency.InstanceNumber?=?@InjectedDependency.InstanceNumber
</div>
  • 第 1 行

    OwningComponentBase<IOwnedDependency> 繼承我們的組件,因此我們的組件將創建自己的注入容器并從中解析 IOwnedComponent 的實例。

  • 第 2 行

    使用標準 @inject 指令讓 Blazor 將 IInjectedDependency 的實例注入我們的組件。

顯示結果

最后,我們將編輯 Index.razor 文件。我們將創建一個布爾字段,并且僅在該字段為 true 時才渲染 MyOwnedComponent。這將告訴 Blazor 在需要時創建組件的實例,并在不需要時釋放它。我們將 @bind 一個 HTML 復選框以允許用戶切換組件。

@page?"/"<input?id="show-component"?type=checkbox?@bind=ShowComponent/>
<label?for="show-component">Show?component</label>@if?(ShowComponent)
{<MyOwningComponent/>
}@code
{bool?ShowComponent?=?false;
}

運行應用程序并切換復選框的狀態將顯示以下內容。

步驟擁有的服務注入的服務
1實例編號 = 1實例編號 = 1
2實例編號 = 2實例編號 = 1
3實例編號 = 3實例編號 = 1

結論

使用 @inject 指令時,Blazor 將從與當前用戶會話(當前瀏覽器選項卡)關聯的依賴項容器中注入 Scoped 依賴項。只有 OwnedComponentBase<T> 中的 T 會從與我們的 OwningComponentBase<T> 派生組件的實例一起創建和銷毀的注入容器中解析。

ed00a40af163e6262ac97d743f1639a4.jpeg

組件擁有多個依賴項的正確方法將在有關非泛型 OwningComponentBase[4] 類的部分中介紹。

參考資料

[2]

源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/DependencyInjection/OwningMultipleDependenciesTheWrongWay

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos的yum源更換為國內的阿里云源

1、備份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web項目

現在的.NET Core 1.0版本是一個很小的核心&#xff0c;APIs和工具也并不完整&#xff0c;但是隨著.Net Core的不斷完善&#xff0c;補充的Apis和創新也會一起整合到.NET Framework中。 安裝centos系統 請自行安裝或百度教程 安裝 libicu包 和 dotnet 溫馨提示&#xff1a;如果需…

Effective Objective-C 2.0 編寫高質量iOS與OS X代碼的52個有效方法筆記-協議與分類...

23、通過委托與數據源協議進行對象間通信 如果要在委托對象上調用可選方法&#xff0c;那么必須提前使用類型信息查詢方法判斷這個委托對象能否響應相關選擇子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作時間調度問題,置換流水車間調度問題的MATLAB求解.doc

物流運籌實務課程設計題目&#xff1a;置換流水車間調度問題的MATLAB求解置換流水車間調度問題的MATLAB求解目錄前言……………………………………………………………………… 5問題描述………………………………………………………………… 6算法設計…………………………………

EntityFrameworkCore 模型自動更新(上)

【導讀】嗯&#xff0c;距離上一次寫博文已經過去近整整十個月&#xff0c;還是有一些思考&#xff0c;但還是變得懶惰了&#xff0c;心思也不再那么專注&#xff0c;有點耗費時間&#xff0c;學習也有點停滯不前&#xff0c;那就順其自然&#xff0c;隨心所欲吧&#xff0c;等…

IDEA 快捷注釋

1. 新建類的注釋模板 1) File->settings->Editor->Live Templates 2) 點擊綠色號&#xff0c;選擇template group &#xff0c;輸入group的name&#xff0c;然后點ok 3) 選中剛才添加的group,點擊號,選擇live Template 4) 代碼模板位置,個人用的代碼: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函數-hidden函數

1、hidden函數&#xff1a;設置或取消隱藏線模式2、用法說明(1)hidden on 函數對當前圖形打開隱藏線條刪除&#xff0c;使網格圖后面的線條被前面的線條遮住。設置曲面圖形對象的屬性FaceColor為坐標軸背景顏色&#xff1b;(2)hidden off 函數對當前圖形關閉隱藏線條刪除&#…

java高級----Thread之CyclicBarrier的使用

CyclicBarrier是一個同步輔助類&#xff0c;它允許一組線程互相等待&#xff0c;直到到達某個公共屏障點 (common barrier point)。今天我們就學習一下CyclicBarrier的用法。 CyclicBarrier的簡單使用 類CyclicBarrier不僅有CountDownLatch所具有的功能&#xff0c;還可以實現屏…

異常處理,究竟是處理什么

“系統中每行代碼&#xff0c;都應該是有意義的&#xff0c;如果一段代碼可有可無&#xff0c;那它就不應該存在。”01—內容簡述異常處理是軟件開發的必備技能&#xff0c;但“異常處理&#xff0c;究竟是處理什么&#xff1f;”&#xff0c;很多小伙伴并沒有一個清晰的認識&a…

第十一篇:(順序)容器的好伴侶 --- 容器適配器

前言 vector容器的數據結構原型是順序表&#xff0c;它很好的實現了順序表的功能&#xff0c;大大方便了編程。好了&#xff0c;現在假設有天我又想用棧&#xff0c;那么有沒有棧對應的容器呢&#xff1f;很遺憾&#xff0c;木有。但基于“棧”可以由順序表或者鏈表實現這一特性…

第一季度ADC市場份額揭榜 A10 Networks再獲用戶青睞

近日&#xff0c;根據全球知名咨詢公司IDC 發布的2018年第一季度中國ADC市場分析報告顯示&#xff0c;A10 Networks 穩占中國ADC市場份額第二名。數據來源&#xff1a;IDC 2018年Q1 ADC市場報告 從廠商排名來看依次為 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

zblog php 標題優化,Zblog分類頁標題重復的優化 - 張力博客

今天瘋子無聊上自己博客看看&#xff0c;點了幾個頁面就發現一個問題。我博客分類頁的標題怎么第一頁和后面的頁數都是一樣的&#xff0c;這一點相信大家都知道對于SEO優化是很不好的一點。我也看了同樣的一些個人zblog博客也存在這樣的問題。于是我在網上就找了關于修改zblog分…

利用linux shell自己主動頂貼

在論壇上面發帖問個什么東西的話&#xff0c;一旦不頂。帖子就秒沉了&#xff0c;可是又實在不想每時每刻都去頂&#xff0c;怎么辦&#xff1f;以下展示了怎樣利用shell 的crontab實現自己主動頂貼。 閑話不多說了&#xff0c;以豆瓣為例—– 1&#xff1a; 用chrome打開豆瓣…

Linux命令之telnet 命令

介紹 Telnet是常用的遠程控制Web服務器的方法 Telnet協議是TCP/IP協議族中的一員&#xff0c;是Internet遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序&#xff0c;用它連接到服務器。終端使用者…

深度學習庫 SynapseML for .NET 發布0.1 版本

2021年11月 微軟開源一款簡單的、多語言的、大規模并行的機器學習庫 SynapseML&#xff08;以前稱為 MMLSpark&#xff09;&#xff0c;以幫助開發人員簡化機器學習管道的創建。具體參見[1]微軟深度學習庫 SynapseML&#xff1a;可直接在系統中嵌入 45 種不同機器學習服務、支持…

Buildroot stress-ng Linux系統壓力測試

/*********************************************************************** Buildroot stress-ng Linux系統壓力測試* 說明&#xff1a;* 之前有使用lmbench對整板進行一些測試&#xff0c;如果相對某一部分專門進行測試&#xff0c;* 就可以參考使用stree-ng…

支持回調處理 php函數,PHP支持回調的函數有哪些?

PHP支持回調的函數有&#xff1a;1、匿名函數&#xff0c;代碼為【$server->on Request】&#xff1b;2、類靜態方法&#xff0c;代碼為【static function test $req】&#xff1b;3、函數&#xff0c;代碼為【my_onRequest $req】。PHP支持回調的函數有&#xff1a;1、匿名…

病毒木馬查殺實戰第019篇:病毒特征碼查殺之編程實現

前言上次我們已經簡介過了病毒特征碼提取的基本方法&#xff0c;那么這次我們就通過編程來實現對于病毒的特征碼查殺。定義特征碼存儲結構為了簡單起見。這次我們使用的是setup.exe以及unpacked.exe這兩個病毒樣本。經過上次的分析&#xff0c;我們對setup.exe樣本的特征碼提取…

《ASP.NET Core 6框架揭秘》實例演示[22]:如何承載你的后臺服務[補充]

借助 .NET提供的服務承載&#xff08;Hosting&#xff09;系統&#xff0c;我們可以將一個或者多個長時間運行的后臺服務寄宿或者承載我們創建的應用中。任何需要在后臺長時間運行的操作都可以定義成標準化的服務并利用該系統來承載&#xff0c;ASP.NET Core應用最終也體現為這…

命令行打印文件樹列表: tree

Linux & Mac 1.下載tree lib //mac brew install tree //centos yum install tree //ubuntu apt-get install tree 用法 //顯示所有文件 tree //顯示深度2層 tree -L 2 2. 命令find組合 find . -print | sed -e s;[^/]*/;|____;g;s;____|; |;g > structure.txt 移除node…