摘要:基於.NET Core 7.0WebApi後端架構實戰【2-介入IOC控制反轉】 2023/04/09, ASP.NET Core 7.0, VS2022 引言 Inversion of Control,簡稱IOC,即控制反轉。記得當初剛實習的時候公司的帶我的人和我提到過IOC這個概念,當初完 ...
摘要:基於.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。