03 Strange Ioc 擴充套件 注入擴充套件 00

2021-09-24 14:04:12 字數 2742 閱讀 8999

您可能聽說過strange是乙個依賴注入框架。我對這種描述有點不舒服。當然,strange提供了di,而且它的用途很好,但是正如我所說,框架的核心是繫結。

安裝附帶了幾個核心binder的有用擴充套件,我將在本節詳細介紹這些擴充套件。

但是請記住,沒有什麼可以阻止您擴充套件繫結器來建立自己的自定義實現。

注意:在接下來的小節中,我經常引用strange的mvcscontext版本。mvcscontext是推薦的版本,它包含下面提到的所有擴充套件。這是最簡單的strange開始方式。

注入擴充套件

與控制反轉(ioc)最密切相關的binder擴充套件是注入器包。 我們暗示了 在前一節中注入一點,現在讓我們進入細節。

您可能熟悉編寫介面的概念。介面本身不包含實現,它只定義類的輸入和輸出。在c#中,這看起來像:

inte***ce ispaceship

}

實現介面的類如下:

class spaceship : ispaceship

public iweapon weapon

}

通過對介面進行程式設計,我們減輕了一些包含子物件的問題。我們的宇宙飛船不再需要乙個鍵盤***,它只需要乙個對輸入做出反應的方法。它不再需要槍,只需要一些滿足iweapon介面的東西(我們稱之為「具體」類)。這是向前邁出的一大步。

但我問題:誰來告訴飛船使用哪種型別的iweapons ?好吧,假設宇宙飛船將在乙個gamefield中,所以也許gamefield可以告訴宇宙飛船它將使用什麼**?但這意味著gamefield需要知道具體的類。所做的就是改變位置 依賴性,所以這沒有好處。

gamefield可以有乙個介面,將其所有依賴項(包括飛船所需的所有內容)等等推到應用程式的頂部。

這將刪除具體的類,但也意味著依賴關係的長鏈貫穿整個類層次結構。這很脆弱,意味著任何地方的變化都可能破壞很多東西,而且很難定位。這也意味著gamefield(以及鏈中的任何其他類)需要了解iweapon。但是gamefield可能並不關心iweapon,那麼為什麼要在不需要iweapon的地方建立乙個依賴關係呢?

工廠模式怎麼樣?如果我建立乙個宇宙飛船工廠,乙個建立宇宙飛船的類ifactory介面,那麼gamefield只需要乙個依賴項。現在我們有了進展。

gamefield ---------> spaceshipfactory : ifactory

ispaceship <--------- (creates concrete spaceship)

我們不需要知道iweapon,雖然我需要知道ispacship,現在我也需要ifactory。嗯,也許是ienemy,,想想看。是的,我需要把所有這些工廠連線起來,弄清楚它們是如何提供的。所以還不錯(這是許多程式設計師所能做到的)。但是,您可以看到,即使是這種公認的模式也有明顯的弱點。

因此,考慮乙個完全不同的模型,其中沒有類必須顯式地滿足另乙個類的依賴關係。這個模型稱為依賴注入(dependency injection, di)。在di中,乙個類請求它需要的東西(理想情況下是以介面的形式),乙個稱為注入器的類提供了這種需要。傳統上,這是通過一種稱為反射的機制來實現的。

使用di,如果gamefield需要一艘ispacship,它會建立乙個如下所示的依賴關係:

ispaceship <--------- (as if by magic)

不依賴依賴鏈或工廠。除了類實際需要的依賴項之外,沒有其他依賴項。而且永遠不需要顯式地顯示依賴關係(當然,您可以選擇這樣做)。

那麼「魔法」是如何起作用的呢?

c#的系統中,反射包允許在執行時對類進行解構和分析。值得注意的是,這不是最快的過程,所以我們在strange中很少使用它,您也應該這樣做。在反映類時,我們可以檢查它的方法和屬性。我們可以看到它的構造方法是什麼樣子的,以及它們需要什麼引數。通過檢查所有這些線索,我們可以推斷類的依賴項是什麼樣子的,然後提供它們。

在strange中設定依賴項的**通常是這樣的:

[inject]

public iinte***ce myinstance

strange如何知道要為iinte***ce提供什麼具體的類?您可以通過在名為context的中心檔案中繫結依賴項來告訴它。正如我所提到的,「標準」context.是mvcscontext,您可以擴充套件這個類來獲得strange的所有strange特性。當擴充套件mvcscontext時,你可以在擴充套件類中建立你的繫結,就像這樣:

injectionbinder.bind().to();
現在,每當乙個類需要iweapon時,都會提供具體的phasergun類。 如果你決定改變 phasergun到squirtcannon,你不會對spaceship或任何其他類別做任何改動。 你只要重新對映:

injectionbinder.bind().to();
您看!宇宙飛船現在使用噴槍。這一切都源於乙個簡單的字,承認這是乙個依賴注入:

class spaceship : ispaceship

[inject] //<----- the magic word!

public iweapon weapon

}

值得注意的是,如果不使用di,這個[inject]屬性標記是完全無害的。所以您可以將它新增到您的類中,然後,如果有一天您發現這個di lark完全是乙個可怕的錯誤(這是最明顯的錯誤),那麼**中的標記對您沒有任何影響。沒有那個[inject]標籤,「weapon」現在只是乙個普通的getter/setter。

YII2框架學習 擴充套件篇(四) 依賴注入

看了一些介紹,感覺都說得不夠透徹啊。我個人簡單舉個例子,就是在搜尋的時候,把所有可變條件都作為引數輸入,這樣可以實現 最大程度的復用,增加 的擴充套件性。不過,yii框架這種情況提供了其他相應的方案,先看看容器方式的實現。說實話,我自己沒看很懂,半知半覺,以後花時間好好研究一下,我怎麼感覺這都不像p...

擴充套件pl0編譯器設計 總述

所謂編譯器,實際上就是我們程式設計時將輸入的高階語言 轉換成相應的目標 從而實現將目標 轉換成彙編碼的一種過渡工具。這種工具根據具體情況不同,可以將不同的高階語言 轉換成不同的目標 例如將pascal語言 轉換成自己定義的四元式等。而乙個簡單的編譯器主要是由以下幾個部分組成的 詞法分析 語法分析 語...

TiDB,為SQL注入分布式可擴充套件性

時下,一大批新型資料庫急劇湧現,諸如google spanner faunadb cockroach以及timescaledb等等,這些資料庫都在專注解決影響標準sql的規模問題。現在,另一位來自中國北京的競爭者 pingcap開源的tidb專案,旨在維持acid事務的同時,使sql也具備nosql...