2008 年 4 月,Unity 1.0 發布。InfoQ 專訪核心開發負責人 Chris Tavares(微軟 P&P 高級工程師,Enterprise Library 4 與 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>(); // 容器遞歸構造整個圖
容器成為智能工廠,統一管理對象創建與依賴解析,配置集中化,變更零代碼侵入。
Chris 強調:不評價優劣,建議團隊自主評估選型。Unity 定位:輕量、官方支持、與 EL/ObjectBuilder 生態融合、擴展點開放(攔截器、自定義 LifetimeManager)。