.Net Core後端架構實戰【3-介入IOC控制反轉】

2023-06-04 21:00:43

摘要:基於.NET Core 7.0WebApi後端架構實戰【2-介入IOC控制反轉】  2023/04/09, ASP.NET Core 7.0, VS2022

引言

    Inversion of Control,簡稱IOC,即控制反轉。記得當初剛實習的時候公司的帶我的人和我提到過IOC這個概念,當初完全不知道是
啥東西。後來有幸寫了半年Java,SpringBoot裡面業務開發隨處可見IOC。再後來我寫.Net Core用到的第一個框架Blog.Core專案,它裡
面IRepository與Repository和IServices與Services,這種解耦的程度單說它貫徹依賴倒置原則是非常nice的!.NetCore時代更加註
重面向介面程式設計,並且它內建輕量型的IOC容器可幫助我們靈活的進行開發。

依賴注入

Dependency Injection,何為依賴注入?由容器動態的將物件依賴的資源注入到物件之中。假設容器在構造物件A時,物件A的構造依賴物件B、物件C、物件D這些引數,容器會將這些依賴關係自動構造好,最大限度的完成程式的解耦。依賴注入(Dependency Injection,簡稱DI)就是構造A物件時,需要依賴B物件,那麼就先構造B物件作為引數傳遞到A物件,這種物件初始化並注入的技術就叫做依賴注入。

.NetCore本身就整合了一個輕量型的IOC容器,我們可以把程式中的抽象(Interface)或業務類根據需要的生命週期設定到容器中。他不是一次把所有的範例都構造出來,當你在用的時候他才會去構造範例!.NetCore內建的IOC容器只支援建構函式注入!

如下三種生命週期的注入:

Singleton:在第一次被請求的時候被建立,物件的建構函式只會執行一次然後一直會存在記憶體中之後就一直使用這一個範例。如果在多執行緒中使用了Singleton,要考慮執行緒安全的問題,保證它不會有衝突。

Scoped:一個請求只建立這一個範例,請求會被當成一個範圍,也就是說單個請求物件的建構函式只會執行一次,同一次請求內注入多次也用的是同一個物件。假如一個請求會穿透應用層、領域層、基礎設施層等等各層,在穿層的過程中肯定會有同一個類的多次注入,那這些多次注入在這個作用域下維持的就是單例。例如工作單元模式就可以藉助這種模式的生命週期來實現,像EF Core的DbContext上下文就被註冊為作用域服務。

Transient:每次請求時都會建立一個新的範例,只要注入一次,建構函式就會執行一次即範例化一次。Scoped、Transient的區別是你在同一個上下文中是否期望使用同一個範例,如果是,用Scoped,反之則使用Transient。