軟體設計原則-依賴倒置(Dependency Inversion Principle,DIP)

来源:http://www.cnblogs.com/yangsofter/archive/2017/05/14/DependencyInversionPrinciple.html
-Advertisement-
Play Games

依賴倒置原則通過確保代碼依賴於抽象而不是具體實現來解耦代碼。依賴註入(Dependency Injection,DI)模式是依賴倒置原則的一種實現方式,DI提供服務所需的所有類,常見的DI三種方式:構造註入、屬性註入和方法註入。 依賴倒置原則的使用意圖: 高層模塊不應該依賴於低層模塊。兩者都應該依賴 ...


依賴倒置原則通過確保代碼依賴於抽象而不是具體實現來解耦代碼。依賴註入(Dependency Injection,DI)模式是依賴倒置原則的一種實現方式,DI提供服務所需的所有類,常見的DI三種方式:構造註入、屬性註入和方法註入。
依賴倒置原則的使用意圖:

高層模塊不應該依賴於低層模塊。兩者都應該依賴於抽象。
抽象不應該依賴於細節。具體細節應該依賴於抽象

代碼示例
Bad Code

    /// <summary>
    /// 聖誕節商品折扣類
    /// </summary>
    public class ChristmasProductDiscount
    {
        public ChristmasProductDiscount()
        {
        }
    }

    /// <summary>
    /// 一個商品類,用於演示和ChristmasProductDiscount類的交互
    /// </summary>
    public class Product
    {
        public void AdjustPriceWith(ChristmasProductDiscount dicount) { }
    }

    /// <summary>
    /// 模擬一個簡單的產品數據倉庫
    /// </summary>
    public class LinqProductRepository
    {
        public IEnumerable<Product> FindAll() {
            return new List<Product>();
        }
    }

    /// <summary>
    /// 產品服務類
    /// </summary>
    public class ProductService
    {
        private LinqProductRepository _productRepository;
        private ChristmasProductDiscount _discountStrategy;

        public  ProductService()
        {
            _productRepository = new LinqProductRepository();
            _discountStrategy = new ChristmasProductDiscount();
        }

        public IEnumerable<Product> GetProducts() {
            IEnumerable<Product> products = _productRepository.FindAll();
            foreach (var p in products)
            {
                p.AdjustPriceWith(_discountStrategy);
            }
            return products;
        }
    }

上面的代碼中,ProductService類緊密的與LinqProductRepository和ChristmasProductDiscount耦合在了一起。一旦LinqProductRepository或ChristmasProductDiscount類無效,將影響ProductService類的使用。為了將高層模塊(ProductService)與低層模塊(LinqProductRepository和ChristmasProductDiscount)解耦,可以通過DI的方式來重構代碼。

    /// <summary>
    /// 產品折扣策略介面
    /// </summary>
    public interface IProductDiscountStrategy
    {

    }

    /// <summary>
    /// 聖誕節商品折扣類
    /// </summary>
    public class ChristmasProductDiscount:IProductDiscountStrategy
    {
        public ChristmasProductDiscount()
        {
        }
    }

    /// <summary>
    /// 一個商品類,用於演示和ChristmasProductDiscount類的交互
    /// </summary>
    public class Product
    {
        /// <summary>
        /// 引用介面而不是具體的策略
        /// </summary>
        public void AdjustPriceWith(IProductDiscountStrategy dicount) { }
    }

    /// <summary>
    /// 為LinqProductRepository類引入介面
    /// </summary>
    public interface IProductRepository
    {
        IEnumerable<Product> FindAll();
    }

    /// <summary>
    /// 模擬一個簡單的產品數據倉庫
    /// </summary>
    public class LinqProductRepository:IProductRepository
    {
        public IEnumerable<Product> FindAll() {
            return new List<Product>();
        }
    }

    /// <summary>
    /// 產品服務類
    /// </summary>
    public class ProductService
    {
        private IProductRepository _productRepository;

        /// <summary>
        /// 通過構造器註入方式,將低層類的創建指責外拋出去
        /// </summary>
        public  ProductService(IProductRepository productRepository)
        {
            _productRepository = productRepository;
        }

        /// <summary>
        /// 通過方法註入的方式將折扣類的實例化外移
        /// </summary>
        public IEnumerable<Product> GetProductsAndApplyDiscount(IProductDiscountStrategy discountStrategy) { 
            IEnumerable<Product> products = _productRepository.FindAll();
            foreach (var p in products)
            {
                p.AdjustPriceWith(discountStrategy);
            }
            return products;
        }
    }

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

-Advertisement-
Play Games
更多相關文章
  • No abstract, please look at the body. ...
  • 1百度一下:centos 打開打開官網、選擇這一項 CET CENTOS 2選擇 DVD ISO,雙擊下載 直接選擇左鍵點擊下載 這裡需要迅雷 方法 二 打開 https://mirrors.aliyun.com/centos/ 進行下載由於阿裡雲目前沒有上傳6.6版本 就已6.8版本為例 2這裡我 ...
  • groupadd [功能說明] 新建用戶組 [語法格式] Groupadd[-f][-r][-g<GID><-o>][組名] [選項參數] 參數 說明 -f 建立已存在的組,強制系統接收已經存在的組名稱。預設情況下,每個組名在系統中應該是唯一的。若groupadd所給組名稱已經存在,將返回錯誤信息 ...
  • 介面隔離原則的意圖就是為了避免我們的代碼依賴一些用不到的介面,介面不應該大而全,而是根據相關功能進行分組。當然介面隔離也不是說要一個行為就定義一個介面,而是更具具體類把共同的行為抽象成一個介面,不同的部分單獨定義成介面。 代碼示例 Bad Code 對於T恤類而言Certification和Runn ...
  • 背水一戰 Windows 10 之 控制項(集合類): FlipView ...
  • 第一種:使用 Microsoft.Office.Interop.Excel.dll 首先需要安裝 office 的 excel,然後再找到 Microsoft.Office.Interop.Excel.dll 組件,添加到引用。 public void ExportExcel(DataTable d ...
  • C#自帶網路請求 由於偶爾會用到服務端請求,寫下隨筆,以便下次使用 . var Url = "http://rueiqiang.vicp.net/api/Franchisee/QueryInstallOrderAndReturn"; WebRequest wReq = WebRequest.Crea ...
  • C#變數初始化是C#強調安全性的另一個例子。簡單地說,C#編譯器需要用某個初始值對變數進行初始化,之後才能在操作中引用該變數。大多數現代編譯器把沒有初始化標記為警告,但C#編譯器把它當作錯誤來看待。 1.在C#中,變數的聲明格式為: 數據類型 變數名; 2.變數的賦值格式為: 變數名 = 數據; 3 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...