public abstract class Player {
[Dependency] // 標記需容器注入
public Song Song { get; set; }
public abstract string Name { get; }
public void Play() => Console.WriteLine($"{Name}: Now Playing [{Song.Name}] by ({Song.Singer})");
}
public class Song {
public string Name => "My Love";
public string Singer => "Westlife";
}
public class Mp3Player : Player { public override string Name => "Mp3 Player"; }
public class CDPlayer : Player { public override string Name => "CD Player"; }
var container = new UnityContainer();
container.RegisterType<Player, Mp3Player>(); // Song 為具體類,無需註冊自動創建
var player = container.Resolve<Player>();
player.Play(); // 輸出: Mp3 Player: Now Playing [My Love] by (Westlife)
當接口有多個實現(如 Player 對應 Mp3Player/CDPlayer)時,屬性注入需指明期望哪個具體類。
public class PlayerStore {
[Dependency("Mp3Player")] // 指定命名映射
public Player PopularPlayer { get; set; }
}
var container = new UnityContainer();
container.RegisterType<Player, Mp3Player>("Mp3Player"); // 註冊命名映射
container.RegisterType<Player, CDPlayer>("CDPlayer");
var store = container.Resolve<PlayerStore>();
Console.WriteLine(store.PopularPlayer.Name); // 輸出: Mp3 Player
同方法注入,Resolve 獲取現有實例不觸發屬性注入,需調用 container.BuildUp<T>(existing) 強制執行。
雙向屬性依賴(A.PropB → B.PropA → A.PropB)將導致解析時無限遞歸。參考《Unity 循環引用四大場景》第 4 類模式,設計時嚴禁雙向屬性依賴。