這是一個關於 ASP.NET 6 依賴註入的系列文章。 在這個系列中,我們將瞭解到什麼是依賴註入、控制反轉,它能夠做什麼,以及我們為什麼要使用它。 之後,我們會進一步瞭解 ASP.NET 6 依賴註入的生命周期、服務容器等重要概念。 最後,我們再深入瞭解服務作用域和更多的服務註冊與註入方式。 概述 ...
這是一個關於 ASP.NET 6 依賴註入的系列文章。
在這個系列中,我們將瞭解到什麼是依賴註入、控制反轉,它能夠做什麼,以及我們為什麼要使用它。
之後,我們會進一步瞭解 ASP.NET 6 依賴註入的生命周期、服務容器等重要概念。
最後,我們再深入瞭解服務作用域和更多的服務註冊與註入方式。
概述
依賴註入是 ASP.NET 框架的核心。
它主要提供兩個核心功能:
-
「註冊類型」,這些註冊到依賴註入系統的類型,在 .NET 中有一個高大上的名字——服務。
因為這些類型都是為了給系統提供某種服務,所以類型註冊也叫服務註冊。
-
「解析實例」,服務/類型被註冊以後,就可以被同樣註入到依賴註入系統中的其它服務/類型使用。
如類型 A 依賴類型 B,類型 A 就可以通過依賴註入獲取類型 B 的實例。
想要徹底理解依賴註入,我們就必須要對控制反轉有所瞭解。
控制反轉
依賴註入中有一個叫做容器的東西,也被稱為 IoC(Inversion of Control - 控制反轉)容器。
這個容器中保存著所有由依賴註入系統創建的實例,那麼它為什麼叫 IoC 容器呢?
「控制反轉(IoC)是一種反轉流、依賴和介面的方式,它把傳統上由程式代碼直接操控的對象的調用權交給第三方,通過第三方來實現對象組件的裝配和管理。」
假設我們有這麼一個場景,一個四、五歲的小朋友,想要吃東西。
如果他自己從冰箱里找東西吃,可能會造成一些不好的結果,比如可能會拿到無法直接直接食用的食物,或者忘記關冰箱門等燈。
你可以思考一下,一個四、五歲的小孩兒,自己去冰箱拿食物,甚至自己去加工食材,你是不是覺得這不太正常?
那麼正常情況是什麼樣的呢?
作為一個四、五歲的小孩兒,只需要找父母陳述一下需求,比如"我餓了、我想吃XX",這個時候,父母就會做好他所需要的食物,然後拿給他。
從主動去冰箱拿(正轉)食物,到你想要吃的食物而被動獲得(反轉),這其實就是一個對象調用權轉移的過程。
前者是主動獲取食物,後者是由父母,也就是第三方把食物給他,而他並不關心食物從哪來,以及怎麼得來。
所謂的“控制反轉”的概念就是「對組件對象控制權的轉移,從程式代碼本身轉移到了代碼之外的第三方。」
通俗地說,就是應用程式的用戶代碼不負責依賴對象的創建和維護,而是將它交給第三方來負責,這樣控制權就由應用程式轉移到了第三方,即控制權實現了所謂的反轉。
例如類型 A 需要使用類型 B 的實例,類型 B 實例的創建並不由類型 A 自己來負責,而是通過第三方來創建。
那麼它和依賴註入又有什麼關係呢?
依賴註入
「依賴註入是 IoC 的一種實現方式,用來實現依賴的反轉。」
在前面的場景中,一個四、五歲的小孩,想要吃東西。
他只需要陳述一下需求,父母就會做好他需要的食物(依賴),然後拿給他(註入)。
依賴註入不是目的,它只是實現控制反轉的方式。
使用依賴註入的目的,是為了管理應用中複雜的依賴關係,它可以幫助我們開發出鬆散耦合、可維護、可測試的代碼和程式。
現在,再讓我們回顧一下控制反轉的解釋。
一種反轉流、依賴和介面的方式,它把傳統上由程式代碼直接操控的對象的調用權交給第三方,通過第三方來實現對象組件的裝配和管理。
這個描述中的第三方就是依賴註入中的控制系統。
IoC 容器
在小孩子吃東西的場景里,有一方扮演著 IoC 容器的角色,你們分析下是誰?
我想很多人的第一直覺是“父母”?
其實,不嚴謹的來說,冰箱才是扮演 IoC 容器的角色,父母則是扮演依賴註入中控制系統的角色。
IoC 容器是依賴註入中一個保存已創建實例的東西,如果實例已創建,並且具有有效的生命周期,那麼控制系統會直接從 IoC 容器獲取實例,否則才會創建實例。
冰箱中的東西,都是父母買回來放進去的,同樣也需要他們從冰箱中拿出來。
「所謂依賴註入系統,本質上就是一個實現了類型註冊、實例解析和實例生命周期管理的組件。」
關於生命周期的內容,我們會在該系列的下一篇文章中詳細討論。
如果你瞭解工廠模式,那麼你可以簡單的把為依賴註入系統看作是一個超級工廠。
在 .NET 的依賴註入系統中,所有註冊的類型,都被稱為服務。
ASP.NET 中的組件,大都都需要通過依賴註入獲取它所依賴的服務實例。
所以說整個 ASP.NET 框架,都是建立在依賴註入系統之上的,這也是開發 ASP.NET 應用的最基本的編程模式。
原文地址:https://www.dongchuanmin.com/net/2008.html