今天講一下,asp.netcore開發中乙個很重要的概念,依賴倒置原則。依賴倒置原則主要是解耦類和類之間的依賴,物件導向乙個很重要的概念就是高內聚,低耦合,降低耦合,可以讓類和類之間的影響最大化降低,簡單點,就是修改乙個類的**,不會讓別的類也無法運作。
依賴倒置就是開發中降低耦合的乙個很好的方式,它通過ioc容器,將所有依賴關係都託管在ioc容器中,類需要什麼,就給什麼,這一過程,也叫做依賴注入(dependency injection)。
在了解依賴倒置之前,先講一下黎克特制轉換原則,子類繼承父類,那麼,原來適用於父類的場景,一定適用於子類,因為子類繼承了父類的所有顯式功能,父類能做的,子類也能做。這一原則就是定義這個理論的存在,子類可以直接替代父類,將父類全部轉換為子類,程式的行為沒有區別。
下面詳細講解一下,何為依賴倒置,舉個例子,老闆需要列印乙份文件,如果自己去列印,老闆就需要找印表機自行列印檔案,這屬於直接依賴印表機。反過來說,老闆找秘書,分配列印任務叫秘書去做,老闆只需要從秘書那裡拿到檔案,不必考慮秘書是如何列印的,這就是依賴倒置。
其實,分配任務的過程其實就是一種抽象,把行為抽象出來,毫不考慮如何列印等細節。在程式開發中,我們非常需要面向抽象,也就是說面向介面程式設計,因為介面就是類的抽象,乙個類依賴介面,那麼所有實現這個介面的類,都能被其所用。
依賴倒置就是類的秘書(ioc),它將類的依賴都託管給自己,類需要什麼,就給什麼,所以使用了依賴倒置原則的asp.netcore程式,在控制器中你很難看到new關鍵字,沒有new例項,怎麼使用類為我們服務呢,我們不需要知道,我們只需要將自己的依賴,放在建構函式中,相當於給ioc容器說明一下,在構造的時候,ioc就會自動new出例項。上面也講到,這一過程叫做依賴注入,那依賴倒置和依賴注入有什麼關係呢,其實依賴注入是依賴倒置的乙個實現方式,也可以說,通過依賴注入,實現了依賴倒置原則。
下面通過**,去看一下,在asp.netcore程式中,如何配置和使用依賴注入
在startup裡邊,有乙個管理中介軟體的類,還有乙個管理依賴注入的類叫configureservices微軟自帶了一套依賴注入的框架,通過這個類,就可以為ioc容器新增預定依賴,如果不新增,ioc找不到對應的依賴原型,就不能提供依賴注入。
//下面解析一下這三種區別,這是三種配置依賴注入的方式
//作用域範圍
services.addscoped();
//瞬時模式
services.addtransient();
//單例模式
services.addsingleton();
作用域範圍的依賴注入,在同乙個作用域下,兩處依賴某物件,ioc 容器會給分配相同的例項,也就是說,相當於兩個例項引用同乙個位址(拿開會舉例子,作用域就是開會時共看乙份會議說明)
瞬時模式,顧名思義,不論任何情況,需要一次就new乙個新的出來(人手乙份會議說明)
單例模式,程式的整個執行週期,只會new一次(每次會議都用乙個會議說明,代代相傳)
單單這樣引用是不會考慮到抽象的,這三個方法都有對應用於抽象的泛型,也是上面**示例的樣子,《介面,實現介面的類》,在依賴注入時,我們只需寫介面物件,ioc就會new乙個實現介面類的例項物件
private這樣,就實現了面向抽象,我用介面物件,所有繼承該介面的類,我都可以用,修改時只需修改startup中的依賴配置即可,乙個檔案看不出效果,不用抽象,直接改**也不費勁,但是如果有100個檔案呢,你會選擇修改一次還是修改100次?readonly
ishoppingoperation _shoppingoperation;
public
homecontroller(ishoppingoperation shoppingoperation)
依賴倒置原則
依賴倒置原則 為什麼會出現這個原則呢?q 所有的一切都源於變化,現在orm足夠強大了,看一下他的原始碼也會發現,工廠 介面的使用都是為了更好的擴充套件。舉個簡單的例子 你的老師讓你寫了乙個 豬 類,實現了他的移動方法,如下 public class pig public class client 第...
依賴倒置原則
1 抽象不應該依賴於具體,具體應該依賴於抽象。2 高層次模組不應該依賴於低層次模組,它們都應該依賴於抽象。對於乙個小賣部來說,有許多飲料,比如可樂 雪碧 橙汁 這時,我們把小賣部定義為乙個具體類,如果我們沒有選擇依賴倒置原則的話,我們就應該在小賣部中new coke new sprit new or...
依賴倒置原則
依賴倒置原則 說白了就是 針對介面程式設計。case 比如在 unity 中,為了使常用 可以復用,會把許多函式寫成程式集,每次做新專案的時候直接呼叫這些函式就可以。也是高層模組依賴低層模組 資源載入,當前專案是使用 resoucers 方式載入的 class resourcemanager 有一天...