為什麼依賴注入出現的頻率這麼高?

2021-10-06 01:24:19 字數 2981 閱讀 9078

前言早上坐地鐵,腦子裡突然閃到依賴注入這個詞,然後努力回憶一下,覺得似懂非懂的,很模糊。

依賴注入在日常專案裡出現的頻率真的是很高了,不管是.net core,還是angular都有使用,那麼依賴注入究竟有什麼優勢呢?

一、什麼是依賴注入

依賴注入(dependency injection)是用於實現控制反轉(inversion of control)的最常見的方式之一。

那麼什麼是控制反轉?

控制反轉

是物件導向程式設計中的一種設計原則,常用於解耦。因為大多數應用程式都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個物件都需要獲取與其合作的物件(也就是它所依賴的物件)的引用。如果這個獲取過程要靠自身實現(也就是通過new乙個你要使用的物件),那麼這將導致**高度耦合並且難以維護和除錯。而控制反轉就是為了解決這個問題。

簡單來說:獲得依賴物件的過程被反轉了」。控制被反轉之後,獲得依賴物件的過程由自身管理變為了由ioc容器主動注入

接著來說依賴注入

依賴注入(di)不需要直接new來獲得這個物件,而是通過相關的容器控制程式,來將要使用的物件在外部new出來並注入到a類裡的引用中,具體獲取的方法和物件被獲取時的狀態則由配置檔案(如xml)來指定。

簡單的來說就是依賴注入提供了裝配能力,框架負責new物件,以及把他們組織起來,你唯一需要做的就是呼叫業務方法。

再翻譯成大白話來說,如果你想吃番茄炒蛋,如果在家自己做的話,需要切番茄,打雞蛋,起鍋放油炒等等等步驟很麻煩,那我可以直接去找個餐廳,點乙份番茄炒蛋,我不管你是怎麼做的,直接吃就行了。

於是:

最後做個總結:

控制反轉(ioc)是實現解耦的一種解決方案,依賴注入是控制反轉的一種實現方式,它提供了裝配能力,框架負責new物件並且管理他們,當你要使用的時候告訴他要使用什麼就可以了(聽起來很像工廠模式?)

試著描述一下這個過程:

物件a依賴於物件b,當物件 a需要用到物件b的時候,ioc容器就會立即建立乙個物件b送給物件a。ioc容器就是乙個物件製造工廠,你需要什麼,它會給你送去,你直接使用就行了,而再也不用去關心你所用的東西是如何製成的,也不用關心最後是怎麼被銷毀的,這一切全部由ioc容器包辦。

二、依賴注入的優缺點

與其說是依賴注入的優缺點,不如說是控制反轉ioc的優缺點。

先說優點,拿上面那個番茄炒蛋的例子來說:

缺點

第一、軟體系統中由於引入了第三方ioc容器,生成物件的步驟變得有些複雜,本來是兩者之間的事情,又憑空多出一道手續,所以,我們在剛開始使用ioc框架的時候,會感覺系統變得不太直觀。所以,引入了乙個全新的框架,就會增加團隊成員學習和認識的培訓成本,並且在以後的執行維護中,還得讓新加入者具備同樣的知識體系。

第二、由於ioc容器生成物件是通過反射方式,在執行效率上有一定的損耗。如果你要追求執行效率的話,就必須對此進行權衡。

第三、具體到ioc框架產品來講,需要進行大量的配製工作,比較繁瑣,對於一些小的專案而言,客觀上也可能加大一些工作成本。(對於使用ide重構,如修改類名的時候,xml檔案中的類名必須手動修改)

第四、ioc框架產品本身的成熟度需要進行評估,如果引入乙個不成熟的ioc框架產品,那麼會影響到整個專案,所以這也是乙個隱性的風險。

總結:

我們大體可以得出這樣的結論:一些工作量不大的專案或者產品,不太適合使用ioc框架產品。另外,如果團隊成員的知識能力欠缺,對於ioc框架產品缺乏深入的理解,也不要貿然引入。最後,特別強調執行效率的專案或者產品,也不太適合引入ioc框架產品。

三、依賴注入的幾種方式,及優缺點

1、建構函式注入,最常用的注入方式,也是angular和.net core預設的注入方式,(框架內部已經幫你實現了ioc容器)

// **來自.net core 官網關於依賴注入的教程

public

class

mydependency

:imydependency

public

task

writemessage

(string message)",

message)

;return task.

fromresult(0

);}}

// 使用的前提,必須在startup.configureservices容器中註冊服務,具體不做描述

services.

addsingleton

(typeof

(ilogger<

>),

typeof

(logger<

>))

;

// **來自angular官網關於依賴注入的教程

export

class

usercontextservice

}// 使用的前提,必須在userservice新增@injectable() 裝飾器,下面**意思是把此服務注入到根module中

@injectable

()

優點:

缺點:2、setter注入

通過屬性的訪問器進行依賴注入

private

imyinte***ce _myinte***ce;

public

imyinte***ce myinte***ce

set}

優點:

缺點:

public

inte***ce

imyinte***ce

}class

myclass

:imyinte***ce

set}

}

獵頭收費為什麼這麼高?

2月24日 獵頭行業是乙個 難懂 的行業。特別是有許多負責招聘的主管或者企業負責人在得到獵頭公司幫助並招聘到合適的人選後,發現自己需要支付一筆相當數量的獵頭費用。高額的獵頭費用會使很多招聘經理皺起眉頭。為什麼會有這樣的感覺呢?我認為問題主要在於獵頭收費的方法和時間 在競爭激烈的地區,很多獵頭公司的服...

為什麼程式設計師工資這麼高?

程式設計師薪水有高有低,有的人乙個月可能拿30k 50k,有的人可能只有2k 3k。同樣有五年工作經驗的程式設計師,可能乙個人每月拿20k,乙個拿5k。是什麼因素導致了這種差異?我特意總結了容易導致薪水低的九大行為表現,避開這些大坑,你就離高薪不遠了。習慣即刻回報 乙個程式設計師的價值,是通過他帶給...

訊號處理中為什麼會出現負頻率

在自然界我們所能夠接觸到的訊號都是實訊號,那麼訊號的頻率肯定都是正的呀,但是在訊號處理過程中進行傅利葉變換後通常會出現負頻率呢?出現這個疑問的最根本原因是沒有搞清楚這兩個頻率之間的關係,確切的來說是此頻率非彼頻率,買個關子,下面開始解釋 就拿週期訊號f x 的傅利葉變換說吧,週期訊號的傅利葉級數展開...