NetCore之依賴注入
前言
現階段而言,依賴注入相關元件如果不會用一兩個,感覺在Code的世界裡肯定是落伍了,最起碼得有工廠模式的思想,知道這樣做的好處;提及到依賴注入,通常會關聯出兩個概念:Ioc
(控制反轉)和DI
(依賴注入)
控制反轉(
Inversion of Control
,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection
,簡稱DI)。通過控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。
個人理解:
IoC
(控制反轉): 就是將原先的new物件這個操作交由第三方容器,由容器統一建立物件並管理其建立物件的生命週期;
DI
(依賴注入): 我理解其中“依賴”有兩層意思:
- 類與類之間的依賴關係;
- 物件的建立依賴於容器;
“注入”:不用主動從容器中獲取物件,由容器根據物件依賴關係自動注入;
依賴注入:程式將物件控制權交給容器,統一依賴容器建立物件,類之間的依賴,也是通過容器自動注入;
注:注入的前提是要把物件的控制權交給容器;
依賴注入優點:
- 輕鬆管理類及類之間的依賴;
- 減少程式碼耦合性;
- 提高程式碼維護性和可擴充套件性;
- 由容器統一建立物件和管理生命週期;
好了,先不詳細深究了,這裡先說說.NetCore
中自帶的依賴注入框架怎麼玩;
正文
先看看.NetCore中的自帶的依賴注入怎麼用,先建立一個Asp.NetCore 程式:
上圖是模板程式,只在Action 方法中直接使用了模板中已經注入好_logger
ILogger
,用起來就是這麼簡單;
.NetCore中依賴注入有幾個關鍵的型別,簡單介紹一下:
-
IServiceCollection
:負責儲存註冊的服務,可以通過其擴充套件方法進行服務註冊; -
ServiceDescriptor
:服務註冊時的資訊,如服務型別、實現型別、例項型別、生命週期等; -
IServiceProvider
: 理解是常說的容器,是IServiceCollection創建出來的,用來提供例項的; -
IServiceScope
:表示一個容器的子容器的生命週期;
通過以上可以簡要理解注入的簡要過程:
通過容器建立的出來的物件,根據不同的注入方式有以下三種生命週期:
-
Singleton
(單例) :整個根容器的生命週期內是同一個物件;通過services.AddSingleton()
方法進行註冊; -
Scoped
(作用域) :在容器或子容器的生命週期內,物件保持一致,如果容器釋放掉,那就意味著物件也會釋放掉;通過services.AddScoped()
方法進行註冊; -
Transient
(瞬時) : 每次使用都會建立新的例項;通過services.AddTransient()
方法進行註冊;
注:services
是 IServiceCollection
services ;
以下通過程式演示常用的注入方法及其對應的生命週期;在以上建立的專案中針對不同的生命週期新增不同的型別,裡面沒有任何程式碼,如下圖;
在Startup
檔案的ConfigureServices
方法中進行註冊,如下:
註冊完畢之後,在Controller
中的Action
方法就可以使用了,如下:
通過對比每個物件的HashCode
, 如果一樣就代表是同一個物件,執行程式看結果(這裡以專案的形式執行,在控制檯中方便看輸出):
以上例項只是常規註冊方式,還有以下常用註冊方式,如下圖;
新增一個IUserService
,方便後續演示
Asp.NetCore自帶依賴注入的註冊方式,如下:
增加一個Action
方法,打了個斷點執行除錯:
其他注入方式就不一一執行演示了,這裡主要演示排他註冊的結果,如下:
所以結果成立IUserService
和IStudentService
都註冊了三次,但最終通過排他註冊方式,最後成功的只一個和兩個;
泛型註冊方式,提供模板註冊,如下:
先定義一個泛型:
註冊,只能通過引數的形式註冊:
使用方式和上面一樣;
依賴注入其他操作:
兩種常用注入方式:
建構函式注入:當注入的服務物件多個地方使用時,就用建構函式的形式注入;
[FromService]
注入:當只是臨時使用服務物件時,就用[FromService]
注入;
本文非原創,轉載於:https://blog.csdn.net/wulex/article/details/118935211,建議至原創出處學習!