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

微軟 Unity 依賴注入容器誕生記:Chris Tavares 訪談錄與架構演進內幕

     編輯:關於.NET

訪談背景:Patterns & Practices 團隊的新成員

2008 年 4 月,Unity 1.0 發布。InfoQ 專訪核心開發負責人 Chris Tavares(微軟 P&P 高級工程師,Enterprise Library 4 與 Unity 主導者),揭示設計動機、架構定位與生態戰略。

Unity 是什麼?——智能對象工廠

Chris 用銀行轉賬例對比傳統強耦合與 DI 重構:

重構前:強耦合地獄

public class AccountTransfer {
    public void TransferMoney(...) {
        var src = AccountDatabase.GetAccount(srcNo); // 靜態依賴
        var dst = AccountDatabase.GetAccount(dstNo);
        src.Withdraw(amt); dst.Deposit(amt);
        Logger.Write(...); // 全局日志依賴
    }
}

痛點:無法單獨編譯/測試、跨銀行擴展難、日志實現硬編碼。

重構後:依賴倒置 + 構造函數注入

public class AccountTransfer {
    private readonly IAccountRepository _accounts;
    private readonly ILogger _logger;
    public AccountTransfer(IAccountRepository accounts, ILogger logger) {
        _accounts = accounts; _logger = logger;
    }
    public void TransferMoney(...) {
        var src = _accounts.GetAccount(srcNo);
        var dst = _accounts.GetAccount(dstNo);
        src.Withdraw(amt); dst.Deposit(amt);
        _logger.Write(...);
    }
}

收益:可測試、可替換實現、職責單一。新問題:創建者需知曉如何構造依賴圖。

容器登場:集中組裝依賴圖

var container = new UnityContainer();
container.RegisterType<IAccountRepository, ContosoBankRepository>();
container.RegisterType<ILogger, DatabaseLogger>();
var transfer = container.Resolve<AccountTransfer>(); // 容器遞歸構造整個圖

容器成為智能工廠,統一管理對象創建與依賴解析,配置集中化,變更零代碼侵入。

Unity 與 Enterprise Library 4 的關係

  • 獨立發布:Unity 獨立 NuGet/下載,EL4 建立在 Unity 之上
  • 歷史淵源:EL2/CAB 使用 ObjectBuilder(構建 DI 容器的框架),後獨立發布
  • 新架構:Unity 內置新版 ObjectBuilder,EL4 仍用 OB 讀配置構建對象,但暴露容器直接訪問 EL 功能
  • 便利性:EL4 安裝包含 Unity 二進制,無需額外安裝

為什麼微軟要造輪子?

  1. 內部統一:CAB、SCSF、WCSF、EL 等產品各自用 OB 方式不兼容,需統一容器標準化指導
  2. 企業級信任:部分客戶拒用開源,微軟官方背書降低採用門檻
  3. 生態推廣:官方容器加速 DI 在 .NET 社區與微軟內部普及

與開源容器(Spring.NET、Castle Windsor、StructureMap、Autofac)的差異化

Chris 強調:不評價優劣,建議團隊自主評估選型。Unity 定位:輕量、官方支持、與 EL/ObjectBuilder 生態融合、擴展點開放(攔截器、自定義 LifetimeManager)。

未來規劃(訪談時點)

  • 方法攔截(AOP)支持——最高優先級
  • 更好的聲明式配置系統
  • 長期:核心平台化(.NET Framework 內置)

快速上手資源

  • Windows Forms 紅綠燈模擬器範例(C#/VB.NET)
  • 完整文檔、快速入門、關鍵場景指南

架構師視角的關鍵啟示

  1. DI 容器本質是對象圖組裝器,核心價值在於將「如何創建」從業務邏輯中剝離
  2. 官方產品與開源生態共存互補,選型應基於團隊技術債、信任鏈、長期維護成本
  3. Unity 的 ObjectBuilder 血統意味著其擴展性基因強大,適合深度定制場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved