【1】.NET6最通俗易懂的依賴註入與控制反轉

来源:https://www.cnblogs.com/Echoxxx/archive/2023/02/10/17109455.html
-Advertisement-
Play Games

這是一個關於 ASP.NET 6 依賴註入的系列文章。 在這個系列中,我們將瞭解到什麼是依賴註入、控制反轉,它能夠做什麼,以及我們為什麼要使用它。 之後,我們會進一步瞭解 ASP.NET 6 依賴註入的生命周期、服務容器等重要概念。 最後,我們再深入瞭解服務作用域和更多的服務註冊與註入方式。 概述 ...


這是一個關於 ASP.NET 6 依賴註入的系列文章。

在這個系列中,我們將瞭解到什麼是依賴註入、控制反轉,它能夠做什麼,以及我們為什麼要使用它。

之後,我們會進一步瞭解 ASP.NET 6 依賴註入的生命周期、服務容器等重要概念。

最後,我們再深入瞭解服務作用域和更多的服務註冊與註入方式。

.NET6最通俗易懂的依賴註入與控制反轉

概述

依賴註入是 ASP.NET 框架的核心。

它主要提供兩個核心功能:

  1. 「註冊類型」,這些註冊到依賴註入系統的類型,在 .NET 中有一個高大上的名字——服務。

    因為這些類型都是為了給系統提供某種服務,所以類型註冊也叫服務註冊。

  2. 「解析實例」,服務/類型被註冊以後,就可以被同樣註入到依賴註入系統中的其它服務/類型使用。

    如類型 A 依賴類型 B,類型 A 就可以通過依賴註入獲取類型 B 的實例。

想要徹底理解依賴註入,我們就必須要對控制反轉有所瞭解。

控制反轉

依賴註入中有一個叫做容器的東西,也被稱為 IoC(Inversion of Control - 控制反轉)容器。

這個容器中保存著所有由依賴註入系統創建的實例,那麼它為什麼叫 IoC 容器呢?

「控制反轉(IoC)是一種反轉流、依賴和介面的方式,它把傳統上由程式代碼直接操控的對象的調用權交給第三方,通過第三方來實現對象組件的裝配和管理。」

假設我們有這麼一個場景,一個四、五歲的小朋友,想要吃東西。

如果他自己從冰箱里找東西吃,可能會造成一些不好的結果,比如可能會拿到無法直接直接食用的食物,或者忘記關冰箱門等燈。

.NET6最通俗易懂的依賴註入與控制反轉

你可以思考一下,一個四、五歲的小孩兒,自己去冰箱拿食物,甚至自己去加工食材,你是不是覺得這不太正常?

那麼正常情況是什麼樣的呢?

作為一個四、五歲的小孩兒,只需要找父母陳述一下需求,比如"我餓了、我想吃XX",這個時候,父母就會做好他所需要的食物,然後拿給他。

從主動去冰箱拿(正轉)食物,到你想要吃的食物而被動獲得(反轉),這其實就是一個對象調用權轉移的過程。

前者是主動獲取食物,後者是由父母,也就是第三方把食物給他,而他並不關心食物從哪來,以及怎麼得來。

所謂的“控制反轉”的概念就是「對組件對象控制權的轉移,從程式代碼本身轉移到了代碼之外的第三方。」

通俗地說,就是應用程式的用戶代碼不負責依賴對象的創建和維護,而是將它交給第三方來負責,這樣控制權就由應用程式轉移到了第三方,即控制權實現了所謂的反轉。

例如類型 A 需要使用類型 B 的實例,類型 B 實例的創建並不由類型 A 自己來負責,而是通過第三方來創建。

那麼它和依賴註入又有什麼關係呢?

依賴註入

「依賴註入是 IoC 的一種實現方式,用來實現依賴的反轉。」

在前面的場景中,一個四、五歲的小孩,想要吃東西。

他只需要陳述一下需求,父母就會做好他需要的食物(依賴),然後拿給他(註入)。

依賴註入不是目的,它只是實現控制反轉的方式。

使用依賴註入的目的,是為了管理應用中複雜的依賴關係,它可以幫助我們開發出鬆散耦合、可維護、可測試的代碼和程式。

現在,再讓我們回顧一下控制反轉的解釋。

一種反轉流、依賴和介面的方式,它把傳統上由程式代碼直接操控的對象的調用權交給第三方,通過第三方來實現對象組件的裝配和管理。

這個描述中的第三方就是依賴註入中的控制系統。

IoC 容器

在小孩子吃東西的場景里,有一方扮演著 IoC 容器的角色,你們分析下是誰?

我想很多人的第一直覺是“父母”?

其實,不嚴謹的來說,冰箱才是扮演 IoC 容器的角色,父母則是扮演依賴註入中控制系統的角色。

IoC 容器是依賴註入中一個保存已創建實例的東西,如果實例已創建,並且具有有效的生命周期,那麼控制系統會直接從 IoC 容器獲取實例,否則才會創建實例。

冰箱中的東西,都是父母買回來放進去的,同樣也需要他們從冰箱中拿出來。

「所謂依賴註入系統,本質上就是一個實現了類型註冊、實例解析和實例生命周期管理的組件。」

關於生命周期的內容,我們會在該系列的下一篇文章中詳細討論。

如果你瞭解工廠模式,那麼你可以簡單的把為依賴註入系統看作是一個超級工廠。

.NET6最通俗易懂的依賴註入與控制反轉

在 .NET 的依賴註入系統中,所有註冊的類型,都被稱為服務。

ASP.NET 中的組件,大都都需要通過依賴註入獲取它所依賴的服務實例。

所以說整個 ASP.NET 框架,都是建立在依賴註入系統之上的,這也是開發 ASP.NET 應用的最基本的編程模式。

原文地址:https://www.dongchuanmin.com/net/2008.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2023-02-10 一、配置SSM環境 1、添加日誌文件 在“shf-parent/web-admin/src/main/resources”下創建“logback.xml” <?xml version="1.0" encoding="UTF-8"?> <configuration debug=" ...
  • 教程簡介 批處理腳本語法 - 從簡單和簡單的步驟學習批處理腳本,從基本到高級概念,包括概述,環境,命令,文件,語法,變數,註釋,字元串,數組,決策,操作符,日期和時間,輸入/輸出,返回代碼,函數,進程,別名,設備,註冊表,網路,列印,調試,日誌記錄。 教程目錄 批處理腳本 - 語法 批處理腳本 - ...
  • 參考:https://blog.csdn.net/weixin_42401159/article/details/112187778 https://cloud.tencent.com/developer/article/1406445 在處理一些自然語言文字的過程中,會遇到一些錶面很奇怪的現象。 ...
  • 一、安裝 kafka是由scala語言寫成的,後面用Java重構了,但是不管怎樣,都要編譯到jvm虛擬機中執行。 centos:yum install java-11-openjdk ubuntu:apt install default-jdk java -version 下載kafka 下載 wg ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為爬蟲的基本介紹。 一、爬蟲概述 爬蟲又稱網路蜘蛛、網路機器人, ...
  • 教程簡介 C#概述 - 從簡單和簡單的步驟學習C#從基本到高級概念,包括概述,環境設置,程式結構,基本語法,數據類型,類型轉換,變數,常量,運算符,決策,迴圈,方法,Nullables ,數組,字元串,結構,枚舉,文件I / O,類,封裝,介面,繼承,命名空間,多態性,運算符重載,封裝,反射,屬性, ...
  • 首先我們需要瞭解到分散式事件匯流排是什麼; 分散式事件匯流排是一種在分散式系統中提供事件通知、訂閱和發佈機制的技術。它允許多個組件或微服務之間的協作和通信,而無需直接耦合或瞭解彼此的實現細節。通過事件匯流排,組件或微服務可以通過發佈或訂閱事件來實現非同步通信。 例如,當一個組件完成了某項任務並生成了一個事件 ...
  • 前言 Web項目中很多網頁資源比如html、js、css通常會做伺服器端的緩存,加快網頁的載入速度 一些周期性變化的API數據也可以做緩存,例如廣告資源位數據,菜單數據,商品類目數據,商品詳情數據,商品列表數據,公共配置數據等,這樣就可以省去很多在服務端手動實現緩存的操作 最早資源緩存大部分都用Ex ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...