跟我一起学.NetCore之依赖注入
前言
現(xiàn)階段而言,依賴注入相關(guān)組件如果不會用一兩個,感覺在Code的世界里肯定是落伍了,最起碼得有工廠模式的思想,知道這樣做的好處;提及到依賴注入,通常會關(guān)聯(lián)出兩個概念:Ioc(控制反轉(zhuǎn))和DI(依賴注入)
控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計原則,可以用來減低計算機(jī)代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI)。通過控制反轉(zhuǎn),對象在被創(chuàng)建的時候,由一個調(diào)控系統(tǒng)內(nèi)所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
百度百科
個人理解:
IoC(控制反轉(zhuǎn)):? 就是將原先的new對象這個操作交由第三方容器,由容器統(tǒng)一創(chuàng)建對象并管理其創(chuàng)建對象的生命周期;
DI(依賴注入):?我理解其中“依賴”有兩層意思:
????類與類之間的依賴關(guān)系;
????對象的創(chuàng)建依賴于容器;
????"注入":不用主動從容器中獲取對象,由容器根據(jù)對象依賴關(guān)系自動注入;
?依賴注入:程序?qū)ο罂刂茩?quán)交給容器,統(tǒng)一依賴容器創(chuàng)建對象,類之間的依賴,也是通過容器自動注入;
注:注入的前提是要把對象的控制權(quán)交給容器;
依賴注入優(yōu)點:
????輕松管理類及類之間的依賴;
????減少代碼耦合性;
????提高代碼維護(hù)性和可擴(kuò)展性;
????由容器統(tǒng)一創(chuàng)建對象和管理生命周期;
好了,先不詳細(xì)深究了,這里先說說.NetCore中自帶的依賴注入框架怎么玩;
正文
????先看看.NetCore中的自帶的依賴注入怎么用,先創(chuàng)建一個Asp.NetCore 程序:
????上圖是模板程序,只在Action 方法中直接使用了模板中已經(jīng)注入好_logger的對象,此對象通過構(gòu)造函數(shù)的形式注入,剛開始接觸的Asp.NetCore的小伙伴會疑問,都沒注冊對應(yīng)服務(wù),怎么會注入,其實在我們啟動過程的時候簡單說到過,框架會自動注入一些默認(rèn)的服務(wù),其中就用ILogger,用起來就是這么簡單;
??? .NetCore中依賴注入有幾個關(guān)鍵的類型,簡單介紹一下:
IServiceCollection:負(fù)責(zé)存儲注冊的服務(wù),可以通過其擴(kuò)展方法進(jìn)行服務(wù)注冊;
ServiceDescriptor:服務(wù)注冊時的信息,如服務(wù)類型、實現(xiàn)類型、實例類型、生命周期等;
IServiceProvider:?理解是常說的容器,是IServiceCollection創(chuàng)建出來的,用來提供實例的;
IServiceScope:表示一個容器的子容器的生命周期;
通過以上可以簡要理解注入的簡要過程:
通過容器創(chuàng)建的出來的對象,根據(jù)不同的注入方式有以下三種生命周期:
Singleton(單例)?:整個根容器的生命周期內(nèi)是同一個對象;通過 services.AddSingleton()方法進(jìn)行注冊;
Scoped(作用域) :在容器或子容器的生命周期內(nèi),對象保持一致,如果容器釋放掉,那就意味著對象也會釋放掉;通過 services.AddScoped()方法進(jìn)行注冊;
Transient(瞬時)?:?每次使用都會創(chuàng)建新的實例;通過 services.AddTransient()方法進(jìn)行注冊;
?? ?注:services 是? IServiceCollection services ;
以下通過程序演示常用的注入方法及其對應(yīng)的生命周期;在以上創(chuàng)建的項目中針對不同的生命周期添加不同的類型,里面沒有任何代碼,如下圖;
????
????在Startup文件的ConfigureServices方法中進(jìn)行注冊,如下:
????注冊完畢之后,在Controller中的Action方法就可以使用了,如下:
????通過對比每個對象的HashCode, 如果一樣就代表是同一個對象,運行程序看結(jié)果(這里以項目的形式運行,在控制臺中方便看輸出):
????
????以上實例只是常規(guī)注冊方式,還有以下常用注冊方式,如下圖;
?? ?新增一個IUserService,方便后續(xù)演示
??
Asp.NetCore自帶依賴注入的注冊方式,如下:
? ?
增加一個Action方法,打了個斷點運行調(diào)試:
其他注入方式就不一一運行演示了,這里主要演示排他注冊的結(jié)果,如下:
所以結(jié)果成立
IUserService和IStudentService都注冊了三次,但最終通過排他注冊方式,最后成功的只一個和兩個;
泛型注冊方式,提供模板注冊,如下:
先定義一個泛型:
注冊,只能通過參數(shù)的形式注冊:
使用方式和上面一樣;
依賴注入其他操作:
兩種常用注入方式:
構(gòu)造函數(shù)注入:當(dāng)注入的服務(wù)對象多個地方使用時,就用構(gòu)造函數(shù)的形式注入;
[FromService]注入:當(dāng)只是臨時使用服務(wù)對象時,就用[FromService]注入;
總結(jié)
????.NetCore自帶的注入常用用法差不多就這些,下一節(jié)說說作用域及容器創(chuàng)建對象之后的釋放;
總結(jié)
以上是生活随笔為你收集整理的跟我一起学.NetCore之依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swagger扩展为你添油加气
- 下一篇: 跟我一起学.NetCore之依赖注入作用