首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

深入理解 DIP、IoC、DI 與 IoC 容器:從生活範例到代碼實戰

     編輯:關於.NET

核心概念速覽

術語全稱定位關係
DIPDependency Inversion Principle軟體架構設計**原則** (抽象層面)源頭思想
IoCInversion of Control軟體設計**模式** (反轉流程/依賴/介面)DIP 的具體實現方式
DIDependency InjectionIoC 的一種**實現技術** (注入依賴)IoC 的主流落地手段
IoC ContainerIoC 容器DI 的**框架** (映射依賴、管理生命週期、建構物件)DI 的自動化工具

生活範例:ATM 與銀行卡

ATM (高層模組) 定義插卡介面 (卡槽、晶片讀取協定)。
銀行卡 (低層模組) 實作該介面 (晶片、磁條)。
使用者 (第三方/容器) 決定插入哪張卡。

→ 高層不依賴低層具體實作,雙方依賴抽象介面。這就是 DIP。

ATM 與銀行卡

代碼演進:從強耦合到 IoC 容器

階段 0:強耦合 (無 DIP)

public class SqlServerDal { public void Add() { Console.WriteLine("SQL Server 寫入訂單"); } }
public class Order {
    private readonly SqlServerDal _dal = new SqlServerDal(); // 直接 new,死綁定
    public void Add() => _dal.Add();
}

換資料庫必須修改 Order 類別,違反開放封閉原則 (OCP)。

強耦合結構

階段 1:DIP + 介面 (依賴倒置)

public interface IDataAccess { void Add(); }
public class SqlServerDal : IDataAccess { public void Add() => Console.WriteLine("SQL Server 寫入"); }
public class AccessDal : IDataAccess { public void Add() => Console.WriteLine("Access 寫入"); }

public class Order {
    private readonly IDataAccess _dal;
    public Order(IDataAccess dal) => _dal = dal; // 建構函式注入
    public void Add() => _dal.Add();
}
依賴倒置結構

階段 2:三種 DI 手動注入方式

方式代碼特點
建構函式注入var order = new Order(new AccessDal());不可變依賴、強制完整性、最推薦
屬性注入order.Ida = new AccessDal();可選依賴、循環依賴時有用、需注意 null
介面注入order.SetDependence(new AccessDal());較少用、需額外介面、複雜度高

階段 3:IoC 容器自動化 (以 Ninject 為例)

var kernel = new StandardKernel();
kernel.Bind<IDataAccess>().To<SqlServerDal>(); // 映射關係

var order = kernel.Get<Order>(); // 容器自動建構 Order 並注入 SqlServerDal
order.Add();

容器職責:掃描映射 → 建構物件圖 → 注入依賴 → 管理生命週期 (Singleton/Transient/Scoped)。

執行結果 AccessDal 結果

主流 IoC 容器推薦

  • Autofac:效能佳、API 現代、.NET Core 原生支援好。
  • Microsoft.Extensions.DependencyInjection:ASP.NET Core 內建、輕量、標準化。
  • Ninject:語法直覺、傳統專案常用。
  • Castle Windsor、StructureMap、Unity、MEF:各有特色生態。

總結

DIP 是「為什麼」,IoC 是「怎麼做」,DI 是「具體手段」,IoC Container 是「自動化工具」。
掌握這層遞進關係,並熟練至少一款 IoC 容器,是寫出可維護、可測試、可擴展軟體架構的關鍵基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved