日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

跟我一起学.NetCore之依赖注入

發(fā)布時間:2023/12/4 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跟我一起学.NetCore之依赖注入 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。