Hi~大家好啊,我有出現了,昨天我們說完了lambda
的基礎使用後大家應該隊這東西沒有哪麼陌生了吧,換作今天,我想來介紹甚麼是依賴注入
(dependency injection, DI),從字面上來看可能一對人都有疑問,這到底是甚麼,它的好處在哪,這些問題今天就由我來告訴各位!!!
一開始剛看到依賴注入這詞時,我心裡有好幾個問號,這到底是甚麼,但是在看過一些大老的介紹後,感覺這東西其實沒有想像中複雜,為了更快了解意思我會先把這詞拆成兩個詞,依賴
和注入
,先說說依賴
,依賴是指接收方所需的物件,注入
是指將「依賴」傳遞給接收方的過程,接收方才會呼叫該「依賴」。此模式確保了任何想要使用給定服務的物件不需要知道如何建立這些服務
在了解依賴注入後我們再來說說,比依賴注入更早被使用的技術控制反轉
(inversion of control, IoC),控制反轉是一種物件導向的設計原則、概念,主要估能跟依賴注入很類似,都是為了降低類別之間的耦合。但是他的缺點就是當被依賴的程式更動時,有使用到的程式也要被更動到,如果才一兩個類別的話其實還好,但是當程式便很多那就不是開玩笑的了
話說回來,依賴注入也是落實了控制反轉
技術,把會過度耦合的問題解決,而依賴注入把原本很複雜的關係,換成依賴在一個服務容器中註冊。客戶類建構函式被注入服務實例。框架負責建立依賴實例並在沒有使用者時銷毀它
最後在來說說依賴注入
控制服務的身命週期,ASP.NET CORE
的註冊物件可以分為三個生命週期,在.NET 6後大多數會把註冊放在Program.cs理這隻檔案哩,這個部分都會在後面的說明出現。
一般來說最常用的會是 Scoped,例如功能服務或登入者資訊,在同一次呼叫中保持同一個即可。但面對 HttpCilent 這類能共用同個實例節省資源的,我們就可以考慮使用 Singleton。這邊就再請各位按照使用場景來決定該用哪種生命週期
另外,注入時請注意生命週期的範圍。例如註冊為 Singleton 的類別不能依賴註冊為 Scoped 的類別,因為如果大家一起用的 Singleton 程式跑到一半,綁在 Request 的 Scoped 依賴對象先消失了,問題可就大了,不可不慎
今天終於說完依賴注入,我要來去好好睡個覺,明天才能好好介紹東西給大家~~~
參考文件:
https://zh.wikipedia.org/zh-tw/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5
https://www.51cto.com/article/620979.html