跟我一起学.NetCore之依赖注入
前言
現階段而言,依賴注入相關組件如果不會用一兩個,感覺在Code的世界里肯定是落伍了,最起碼得有工廠模式的思想,知道這樣做的好處;提及到依賴注入,通常會關聯出兩個概念:Ioc(控制反轉)和DI(依賴注入)
控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
百度百科
個人理解:
IoC(控制反轉):? 就是將原先的new對象這個操作交由第三方容器,由容器統一創建對象并管理其創建對象的生命周期;
DI(依賴注入):?我理解其中“依賴”有兩層意思:
????類與類之間的依賴關系;
????對象的創建依賴于容器;
????"注入":不用主動從容器中獲取對象,由容器根據對象依賴關系自動注入;
?依賴注入:程序將對象控制權交給容器,統一依賴容器創建對象,類之間的依賴,也是通過容器自動注入;
注:注入的前提是要把對象的控制權交給容器;
依賴注入優點:
????輕松管理類及類之間的依賴;
????減少代碼耦合性;
????提高代碼維護性和可擴展性;
????由容器統一創建對象和管理生命周期;
好了,先不詳細深究了,這里先說說.NetCore中自帶的依賴注入框架怎么玩;
正文
????先看看.NetCore中的自帶的依賴注入怎么用,先創建一個Asp.NetCore 程序:
????上圖是模板程序,只在Action 方法中直接使用了模板中已經注入好_logger的對象,此對象通過構造函數的形式注入,剛開始接觸的Asp.NetCore的小伙伴會疑問,都沒注冊對應服務,怎么會注入,其實在我們啟動過程的時候簡單說到過,框架會自動注入一些默認的服務,其中就用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]注入;
總結
????.NetCore自帶的注入常用用法差不多就這些,下一節說說作用域及容器創建對象之后的釋放;
總結
以上是生活随笔為你收集整理的跟我一起学.NetCore之依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swagger扩展为你添油加气
- 下一篇: 跟我一起学.NetCore之依赖注入作用