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

Unity 方法調用注入實戰:靈活初始化的另類選擇

     編輯:關於.NET

何時選擇 Method Call Injection?

  • 構造函數過多、參數相近導致調試維護困難
  • 需隱藏依賴細節,不暴露為公共屬性
  • 希望通過修改依賴實現類控制注入行為,而不動父類代碼
  • 初始化邏輯複雜,需在對象構造後執行特定方法

核心機制:[InjectionMethod] 標記延遲執行

不同於構造函數注入(解析即執行),方法注入在對象創建後、返回調用者前由容器自動調用標記方法,並自動解析其參數依賴。

實戰範例:播放器初始化歌曲

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)
方法注入輸出
圖 1:方法調用注入成功初始化依賴

關鍵行為細節

  1. 參數自動解析:方法參數類型需在容器中可解析(已註冊或為具體類)
  2. 單一方法限制:每類型僅允許一個 [InjectionMethod],多標記將拋異常
  3. 執行時機:Resolve 過程中,構造函數完成後、屬性注入前/後(具體順序視版本)調用
  4. 現有實例不適用:Resolve 獲取現有實例不觸發方法注入,需用 BuildUp(但 BuildUp 也不調用構造函數)

循環引用風險預警

方法間相互調用(Method1→Method2→Method1)將導致死循環,參考《Unity 循環引用四大場景》規避。

對比總結:三種注入方式的定位

注入方式執行時機適用場景侵入性
構造函數注入對象創建時強依賴、不可變對象、必須依賴低(無 Attribute 僅單構造函數)
屬性注入創建後、返回前可選依賴、運行時可變、需外部可見中(需 [Dependency])
方法調用注入創建後、返回前複雜初始化邏輯、隱藏依賴、多步驟設置中(需 [InjectionMethod])

官方建議:無特殊理由優先選構造函數注入,它最符合通用需求且最安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved