組件庫/框架內部 new 出的對象(如 CoreLib.CreatePlayer() 返回 Mp3Player),其依賴屬性(Owner)無法由容器自動注入,直接訪問拋出空引用異常。
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<T>(T existing) | 類型推斷,最常用 |
BuildUp<T>(T existing, string name) | 指定命名映射 |
BuildUp(Type t, object existing) | 非泛型版本,動態類型 |
BuildUp(Type t, object existing, string name) | 完整參數控制 |
關鍵限制:BuildUp 不執行構造函數注入(對象已構造完成),僅處理 [Dependency] 標記的屬性與 [InjectionMethod] 標記的方法。
需在類庫代碼中引用 Microsoft.Practices.Unity 並標記 [Dependency],這屬於侵入式設計。對比 Castle Windsor / Spring.NET 的純配置方式,Unity 侵入性更強。選型時需權衡: