不同於構造函數注入(解析即執行),方法注入在對象創建後、返回調用者前由容器自動調用標記方法,並自動解析其參數依賴。
public interface IPlayer { void Play(); }
public class Song {
public string Name => "My Love";
public string Singer => "Westlife";
}
public class Mp3Player : IPlayer {
public Song CurrentSong { get; private set; }
[InjectionMethod]
public void Initialize(Song song) => CurrentSong = song; // 容器自動調用並注入 Song
public void Play() => Console.WriteLine($"{Name}: Now Playing [{CurrentSong.Name}] by ({CurrentSong.Singer})");
public string Name => "Mp3 Player";
}
var container = new UnityContainer();
container.RegisterType<IPlayer, Mp3Player>(); // Song 類無需顯式註冊,容器自動實例化具體類
var player = container.Resolve<IPlayer>();
player.Play(); // 輸出: Mp3 Player: Now Playing [My Love] by (Westlife)
[InjectionMethod],多標記將拋異常Resolve 過程中,構造函數完成後、屬性注入前/後(具體順序視版本)調用Resolve 獲取現有實例不觸發方法注入,需用 BuildUp(但 BuildUp 也不調用構造函數)方法間相互調用(Method1→Method2→Method1)將導致死循環,參考《Unity 循環引用四大場景》規避。
| 注入方式 | 執行時機 | 適用場景 | 侵入性 |
|---|---|---|---|
| 構造函數注入 | 對象創建時 | 強依賴、不可變對象、必須依賴 | 低(無 Attribute 僅單構造函數) |
| 屬性注入 | 創建後、返回前 | 可選依賴、運行時可變、需外部可見 | 中(需 [Dependency]) |
| 方法調用注入 | 創建後、返回前 | 複雜初始化邏輯、隱藏依賴、多步驟設置 | 中(需 [InjectionMethod]) |
官方建議:無特殊理由優先選構造函數注入,它最符合通用需求且最安全。