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

Unity BuildUp 機制詳解:為存量對象注入依賴的關鍵技術

     編輯:關於.NET

痛點:第三方創建的對象如何參與 DI?

組件庫/框架內部 new 出的對象(如 CoreLib.CreatePlayer() 返回 Mp3Player),其依賴屬性(Owner)無法由容器自動注入,直接訪問拋出空引用異常。

BuildUp:為現有實例補全依賴圖

IUnityContainer.BuildUp<T>(T existing) 將已存在實例納入容器管理,執行屬性注入與方法調用注入(不執行構造函數)。

核心類定義

public abstract class Player {
    public abstract void Play();
    public abstract string Name { get; }
    [Dependency] // 標記需注入
    public Owner Owner { get; set; }
}
public class Owner {
    public string Name => "Inrie";
    public int Age => 24;
}

問題復現與解決

// 無 BuildUp:Owner 為 null,拋異常
var player = new CoreLib().CreatePlayer();
Console.WriteLine(player.Owner.Name); // NullReferenceException

// 使用 BuildUp:自動注入 Owner 實例
var container = new UnityContainer();
var player = container.BuildUp<Player>(new CoreLib().CreatePlayer());
Console.WriteLine(player.Owner.Name); // 輸出 "Inrie"
BuildUp 成功輸出
圖 1:BuildUp 成功注入 Owner 依賴

BuildUp 重載與適用邊界

方法簽名用途
BuildUp<T>(T existing)類型推斷,最常用
BuildUp<T>(T existing, string name)指定命名映射
BuildUp(Type t, object existing)非泛型版本,動態類型
BuildUp(Type t, object existing, string name)完整參數控制

關鍵限制:BuildUp 不執行構造函數注入(對象已構造完成),僅處理 [Dependency] 標記的屬性與 [InjectionMethod] 標記的方法。

侵入性權衡:Attribute 標記的代價

需在類庫代碼中引用 Microsoft.Practices.Unity 並標記 [Dependency],這屬於侵入式設計。對比 Castle Windsor / Spring.NET 的純配置方式,Unity 侵入性更強。選型時需權衡:

  • 若控制類庫源碼,Attribute 方式開發效率高、可讀性強
  • 若為第三方封裝組件,傾向 XML 配置或約定式註冊避免污染領域模型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved