1. 程式人生 > >大話DI依賴注入+IOC控制反轉(二) 之 淺析.Net Core中的DI與IOC

大話DI依賴注入+IOC控制反轉(二) 之 淺析.Net Core中的DI與IOC

      在上一篇文章中,我們聊了很多關於定義的方面,比較孤燥,下面我們結合.Net Core聊一下依賴注入&控制反轉。

 

三種物件生命週期

      關於.Net Core中的容器,有三種物件的生命週期,這個從網上搜索也有大堆的資料。為了循序漸進,我們這裡介紹一下。

Transient

      稱為短暫,意思是需要使用時就建立一個新的物件。從容易層面講,當從容器取出時,都建立一個新的物件。這種是最常用的,因為我們一般使用物件都直接建立。

Scope

      稱為範圍使用,在ASP.Net Core中,Scope就是在一次API請求中,都是同一個物件。最經典的要數EF框架中,新增Context是用Scope型別。即在一次請求中,建立一個DB連線,請求完畢斷開連線。

更深一層說,在子容器中,scope都是同一個物件;根容器中,scope全部都是同一個物件,等同於單例。

Singleton

      稱為單例模式,此模式也是常用。一般需要建立全域性的單例,如資料庫連線類、配置類、公共類等。此型別在一個應用中,永遠都只有一個物件,所以要注意執行緒的問題。

 

大話.Net Core

     在.Net Core中,原生的依賴注入框架是Microsoft.Extensions.DependencyInjection。

      在此框架中,容器類是集成於介面IServiceCollection的ServiceCollection。簡單地理解此類是一個集合,裝載了所有物件。還有一個常用的是ServiceProvider,此類是提供從容器ServiceCollection獲取集合的操作。

簡單的依賴注入                           
 

下面,我們在控制檯應用中簡單地使用一下依賴注入。

      首先建立兩個實體,一個電話Phone,一個電話筒Microphone。電話筒是作為電話的一個屬性。

clipboard_看圖王

     

      然後,我們建立容器並且從容器中獲取物件。

clipboard1_看圖王

 

      從上面,我們可以列印到Phone的資訊,並且也能列印Microphone的資訊。因為我們把兩個物件都放入到了容器集合中。

      在上面的例子中,Microphone是作為構造引數,被依賴於Phone中。這種注入,稱為構造器注入。而且在.Net Core中,只有這種依賴方式。還有其它的依賴方式,如方法注入、屬性注入。

      那麼,為什麼在.Net Core中只有構造器注入呢?因為在所有注入方式來說,構造器注入是最正宗的注入。好處在於:保證依賴不可變、保證依賴不可空、避免了迴圈依賴、提升了程式碼的可複用性。

      並不是說構造器注入是萬金油,也有些情況需要用屬性注入等方式。所以,後面的注入方式.Net Core遲早要加入。

 

構造器注入選擇                                   

      在.Net Core中,構造器注入的選擇都是選擇最多引數的,並且此引數都屬於容器中。

      要證明上面的觀點,我們做下面最經典的例子來說明。

 

建立3個類,分別為A、B、C。C類依賴與A與B,如下:

clipboard_看圖2王

 

初始化容器,並取出C類。

clipboard_看22圖王

 

      我們可以看到控制檯列印:【in a b】。

      所以,驗證了上面的觀點。使用構造注入時,使用構造引數最多,並且引數都屬於容器中的構造器。

 

總結

      上面淺析了DI與IOC在.Net Core中的應用。介紹了三種不同的生命週期與場景,使用構造器注入時.Net Core的選擇。

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。