依賴註入

来源:https://www.cnblogs.com/wktang/archive/2019/01/31/10341918.html
-Advertisement-
Play Games

軟體設計模式 為了更好地理解依賴註入的概念,首先瞭解一下軟體設計模式是很有必要的。軟體設計模式主要用來規範問題及其解決方案的描述,以簡化開發人員對常見問題及其對應解決方案的標識與交流。 控制反轉IOC 幾乎每個人都看過或是自己寫過下麵代碼的經歷 1 public class EmailService ...


  • 軟體設計模式

 為了更好地理解依賴註入的概念,首先瞭解一下軟體設計模式是很有必要的。軟體設計模式主要用來規範問題及其解決方案的描述,以簡化開發人員對常見問題及其對應解決方案的標識與交流。

  •  控制反轉IOC

 幾乎每個人都看過或是自己寫過下麵代碼的經歷

 1 public class EmailService
 2  {
 3         public void SendMsg()
 4         {
 5             Console.WriteLine("Hello world !!!");
 6         } 
 7 }
 8 
 9 /// <summary>
10 /// 耦合實現
11 /// </summary>
12  public class NotificationSys
13  {
14         private EmailService svc;
15 
16         public NotificationSys()
17         {
18             svc = new EmailService();
19         }
20 
21         public void  InterestingEventHappened()
22         {
23             svc.SendMsg();
24         } 
25 }
View Code

 上述代碼中,NotificationSys 類依賴EmailService類,當一個組件依賴其他組件稱之耦合。在軟體設計過程,高耦合通常認為是軟體設計的責任。當一個類精確地知道另一個類的設計和實現時,就會增加軟體修改的負擔,因為修改一個類很有可能破壞依賴它的另一個類。為降低組件之間的耦合程式,一般採取兩個獨立但相關的步驟:

1.在兩塊代碼之間引入抽象層,所以上述代碼可修改為以下

 1   public interface IEmailService
 2   {
 3         void SendMsg();
 4   }
 5   public class EmailService : IEmailService
 6  {
 7         public void SendMsg()
 8         {
 9             Console.WriteLine("Hello world !!!");
10         }
11  }
12  /// <summary>
13  /// 抽象介面來實現
14  /// (把抽象實現的責任移到消費者的外部)
15  /// </summary>
16  public class NotificationSys1
17  {
18         private IEmailService svc;
19         public NotificationSys1()
20         {
21             svc = new EmailService1();
22         }
23         public void InterestingEventHappened()
24         {
25             svc.SendMsg();
26         }
27  }
View Code

2.把選擇抽象實現的責任移到消費者類的外部。

控制反轉(IOC)模式是抽象的;把依賴的創建移到使用這些的類的外部,這稱為控制反轉模式,之所以以這樣命名,是因為反轉的是依賴的創建,正因為如此,才消除消費類對依賴創建的控制。

  •  依賴註入DI

 依賴註入是另一種控制反轉模式形式,它沒有像伺服器定位器一樣的中間對象。相反,組件以一種允許依賴的方式編寫,通常由構造函數參數或屬性設置器來顯式表示。

1. 構造函數註入

DI 的最常見形式是構造函數註入。該技術需要我們為類創建一個顯示表示所以依賴的構造函數。

 1  /// <summary>
 2  /// 構造註入
 3  /// </summary>
 4  public class NotificationSys
 5  {
 6         private IEmailService _svc;
 7 
 8         public NotificationSys(IEmailService svc)
 9         {
10             _svc =svc ;
11         }
12         public void InterestingEventHappened()
13         {
14             _svc.SendMsg();
15         }
16   }
View Code

優點: 極大簡化構造函數的實現;減少了NotificationSys類需要知道的信息量;需求的透明性,任何想創建NotificationSys類實例的代碼都能查看構造函數,並精確的知道哪些內容是消費者必須的。

2.屬性註入

 屬性註入是一種不太常見的依賴註入方式。顧名思義,該方式是通過設置對象上公共屬性而不是通過使用構造函數參數來註入依賴。

public class NotificationSys
 {
        private IEmailService svc{get;set;}

        public void InterestingEventHappened()
        {
            svc.SendMsg();
        }
 }
View Code

顯而易見,這裡我們已經減少了需求的透明性,而且絕對比構造函數註入更容易產生錯誤。

選擇屬性註入原因: 

如果依賴在某種意義上是真正可選的,即在消費者類不提供依賴時,也有相應的處理,屬性註入是個不錯的選擇

類的實例可能需要在我們還沒有控制調用的構造函數的情況下被創建

  • 依賴註入容器

 依賴註入容器是一個可以作為組件工廠使用的軟體庫,它可以自動檢測和滿足裡面元素的依賴需求。常見的DI容器有 CastleWindsor,Unity,Autofac,    ObjectBuilder,StructureMap,Spring.Net 

 

 

路漫漫其修遠兮, 吾將上下而求索


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

-Advertisement-
Play Games
更多相關文章
  • 第六章 類型 相等 轉換等 一、類型 1 typeof(); typeof是一個內置的JavaScript運算符,可用於探測其操作數的類型。 例: 2 undefined 說明:對於任何還沒有值(即未初始化)的東西,都會將undefined賦給它;undefined的類型是undefined 【未初 ...
  • 第五章 網頁交互——文本對象模型【Document object model】 1 簡單介紹DOM,dom是將html與javascript進行交互的工具。 【使用innerHTML時註意:html中的內容是按照HTML本身的先後順序載入的。故js對應代碼應置於html之後】 問題: *docume ...
  • 原始的調用客戶端的方式是通過註入restTemplate的方式 通過feign的方式 配置消費者項目cloud-consume pom.xml 依賴jar application.yml 添加啟動feign 可實現錯誤回調 啟動應用類 ClondConsumeApplication.java 添加註 ...
  • spring cloud分為註冊端、客戶端以及消費端 初體驗的理解就是: 註冊端就是將之前所有的應用在這邊進行註冊,然後給每個應用都生成自己的標識,這些應用就是來自於客戶端,消費端則通過調用註冊端(有點數據中心的概念)然後去調用客戶端各個的應用. 1、註冊端代碼: 直接創建maven項目: pom. ...
  • 0 前言 提前先祝大家春節快樂!好了,先簡單聊聊。 我從事的是大數據開發相關的工作,主要負責的是大數據計算這塊的內容。最近Hive集群跑任務總是會出現Thrift連接HS2相關問題,研究瞭解了下內部原理,突然來了興趣,就想著自己也實現一個RPC框架,這樣可以讓自己在設計與實現RPC框架過程中,也能從 ...
  • 閱讀本文大概需要 3.5 分鐘。 本篇是設計模式系列的開篇,雖然之前也寫過相應的文章,但是因為種種原因後來斷掉了,而且發現之前寫的內容也很渣,不夠系統。 所以現在打算重寫,加上距離現在也有一段時間了,也算是自己的一個回顧吧! 學而時習之,不亦說乎。 從零開始單排學設計模式的國服排位之旅,今天正式開啟 ...
  • 單例模式 1.個人思路 1.業務需求 統一使用同一個對象(創建的對象為一個 使用的對象是同一個) 2.業務思考 3.實現的方案 2.保證生成的單例唯一 2.1 使用static讓系統幫忙初始化 2.2 使用Unity的生命周期 2.3 使用鎖保證單例唯一 2.4 使用字典保證生成的單例唯一 2.5 ...
  • 包括7大設計原則和23大設計模式。7大設計原則這7大設計原則不僅是23大設計模式要去遵守的,也是我們平常開發過程中要時刻去遵守的準則,所以說非常非常重要。1,單一職責原則1)定義:就一個類而言,應該僅有一個引起它變化的原因。簡而言之,就是功能要單一。2)如果一個類承擔的職責過多,就等於把這些職責耦合... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...