iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
Modern Web

.NET教我做人系列 第 8

Day 8 依賴注入(DI)

  • 分享至 

  • xImage
  •  

Hi~大家好啊,我有出現了,昨天我們說完了lambda的基礎使用後大家應該隊這東西沒有哪麼陌生了吧,換作今天,我想來介紹甚麼是依賴注入(dependency injection, DI),從字面上來看可能一對人都有疑問,這到底是甚麼,它的好處在哪,這些問題今天就由我來告訴各位!!!

一開始剛看到依賴注入這詞時,我心裡有好幾個問號,這到底是甚麼,但是在看過一些大老的介紹後,感覺這東西其實沒有想像中複雜,為了更快了解意思我會先把這詞拆成兩個詞,依賴注入,先說說依賴,依賴是指接收方所需的物件,注入是指將「依賴」傳遞給接收方的過程,接收方才會呼叫該「依賴」。此模式確保了任何想要使用給定服務的物件不需要知道如何建立這些服務

在了解依賴注入後我們再來說說,比依賴注入更早被使用的技術控制反轉(inversion of control, IoC),控制反轉是一種物件導向的設計原則、概念,主要估能跟依賴注入很類似,都是為了降低類別之間的耦合。但是他的缺點就是當被依賴的程式更動時,有使用到的程式也要被更動到,如果才一兩個類別的話其實還好,但是當程式便很多那就不是開玩笑的了

https://ithelp.ithome.com.tw/upload/images/20220915/20139256nHPuzjukzY.jpg

話說回來,依賴注入也是落實了控制反轉技術,把會過度耦合的問題解決,而依賴注入把原本很複雜的關係,換成依賴在一個服務容器中註冊。客戶類建構函式被注入服務實例。框架負責建立依賴實例並在沒有使用者時銷毀它

https://ithelp.ithome.com.tw/upload/images/20220915/20139256iGCJ1as2Mx.jpg

最後在來說說依賴注入控制服務的身命週期,ASP.NET CORE的註冊物件可以分為三個生命週期,在.NET 6後大多數會把註冊放在Program.cs理這隻檔案哩,這個部分都會在後面的說明出現。

  • Transient(一次性):每次注入都建立一個新的
  • Scoped(作用域):每次 Request 都建立一個新的,同個 Request 重複利用同一個
  • Singleton(單例):只建立一個新的,每次都重複利用同一個

一般來說最常用的會是 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


上一篇
Day 7 今天不lambda甚麼時候浪!
下一篇
Day 9 開始我們的 Web Api旅程
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言