1. 程式人生 > 實用技巧 >依賴倒置原則

依賴倒置原則

今天講一下,Asp.NetCore開發中一個很重要的概念,依賴倒置原則。依賴倒置原則主要是解耦類和類之間的依賴,面向物件一個很重要的概念就是高內聚,低耦合,降低耦合,可以讓類和類之間的影響最大化降低,簡單點,就是修改一個類的程式碼,不會讓別的類也無法運作。

依賴倒置就是開發中降低耦合的一個很好的方式,它通過IOC容器,將所有依賴關係都託管在IOC容器中,類需要什麼,就給什麼,這一過程,也叫做依賴注入(Dependency Injection)。

在瞭解依賴倒置之前,先講一下里氏轉換原則,子類繼承父類,那麼,原來適用於父類的場景,一定適用於子類,因為子類繼承了父類的所有顯式功能,父類能做的,子類也能做。這一原則就是定義這個理論的存在,子類可以直接替代父類

,將父類全部轉換為子類,程式的行為沒有區別。

下面詳細講解一下,何為依賴倒置,舉個例子,老闆需要列印一份文件,如果自己去列印,老闆就需要找印表機自行列印檔案,這屬於直接依賴印表機。反過來說,老闆找祕書,分配列印任務叫祕書去做,老闆只需要從祕書那裡拿到檔案,不必考慮祕書是如何列印的,這就是依賴倒置。

其實,分配任務的過程其實就是一種抽象,把行為抽象出來,毫不考慮如何列印等細節。在程式開發中,我們非常需要面向抽象,也就是說面向介面程式設計,因為介面就是類的抽象,一個類依賴介面,那麼所有實現這個介面的類,都能被其所用。

依賴倒置就是類的祕書(IOC),它將類的依賴都託管給自己,類需要什麼,就給什麼,所以使用了依賴倒置原則的ASP.NetCore程式,在控制器中你很難看到new關鍵字,沒有new例項,怎麼使用類為我們服務呢,我們不需要知道,我們只需要將自己的依賴,放在建構函式中,相當於給IOC容器說明一下,在構造的時候,IOC就會自動new出例項。上面也講到,這一過程叫做依賴注入,那依賴倒置和依賴注入有什麼關係呢,其實依賴注入是依賴倒置的一個實現方式,也可以說,通過依賴注入,實現了依賴倒置原則。

下面通過程式碼,去看一下,在ASP.netCore程式中,如何配置和使用依賴注入

在StartUp裡邊,有一個管理中介軟體的類,還有一個管理依賴注入的類叫ConfigureServices微軟自帶了一套依賴注入的框架,通過這個類,就可以為IOC容器新增預定依賴,如果不新增,IOC找不到對應的依賴原型,就不能提供依賴注入。

//這是三種配置依賴注入的方式
  //作用域範圍
  services.AddScoped<IShoppingOperation, ShoppingOperation>();
  //瞬時模式
  services.AddTransient<IShoppingOperation, ShoppingOperation>();
  
//單例模式 services.AddSingleton<IShoppingOperation, ShoppingOperation>();

下面解析一下這三種區別,

作用域範圍的依賴注入,在同一個作用域下,兩處依賴某物件,IOC 容器會給分配相同的例項,也就是說,相當於兩個例項引用同一個地址(拿開會舉例子,作用域就是開會時共看一份會議說明)

瞬時模式,顧名思義,不論任何情況,需要一次就new一個新的出來(人手一份會議說明)

單例模式,程式的整個執行週期,只會new一次(每次會議都用一個會議說明,代代相傳)

單單這樣引用是不會考慮到抽象的,這三個方法都有對應用於抽象的泛型,也是上面程式碼示例的樣子,<介面,實現介面的類>,在依賴注入時,我們只需寫介面物件,IOC就會new一個實現介面類的例項物件

 private readonly IShoppingOperation _shoppingOperation;
public HomeController(IShoppingOperation shoppingOperation) { _shoppingOperation = shoppingOperation; }

這樣,就實現了面向抽象,我用介面物件,所有繼承該介面的類,我都可以用,修改時只需修改startup中的依賴配置即可,一個檔案看不出效果,不用抽象,直接改程式碼也不費勁,但是如果有100個檔案呢,你會選擇修改一次還是修改100次?

這是我的公眾號二維碼