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

Unity 依賴注入容器快速上手:從註冊到解析的完整實戰入門

     編輯:關於.NET

核心概念三句話

  • 容器:對象工廠+生命周期管理器,持有類型映射與實例引用
  • 註冊:建立「接口/基類 → 具體類/實例」映射,配置生命周期
  • 解析:根據映射創建或獲取對象實例,自動遞歸注入依賴

五分鐘極速體驗

// 1. 創建容器
IUnityContainer container = new UnityContainer();

// 2. 註冊類型映射:IPlayer → Mp3Player
container.RegisterType<IPlayer, Mp3Player>();

// 3. 解析獲取實例,容器自動構造 Mp3Player 並注入其依賴
IPlayer player = container.Resolve<IPlayer>();

// 4. 使用對象
player.Play(); // 輸出: Playing Mp3
快速開始輸出
圖 1:最簡單的註冊解析流程

兩大註冊方式深度對比

RegisterType:類型映射,延遲創建

  • 映射「契約類型 → 實現類型」
  • 每次 Resolve 由容器新建實例(默認瞬態)
  • 支持命名映射:container.RegisterType<IPlayer, Mp3Player>("MyMp3")
  • 豐富重載:指定 LifetimeManager、非泛型版本等

RegisterInstance:實例映射,單例語義

  • 映射「契約類型 → 現有實例」
  • 默認使用 ContainerControlledLifetimeManager(容器級單例)
  • 同樣支持命名:container.RegisterInstance<IPlayer>("MyMp3", mp3Instance)
  • 適用於:預先創建的昂貴對象、配置對象、外部管理的單例

解析方法全景

Resolve:單實例獲取

方法行為
Resolve<T>()獲取默認映射實例
Resolve<T>(name)獲取指定命名映射實例
Resolve(type) / Resolve(type, name)非泛型版本,動態類型場景

多映射解析規則

container.RegisterType<IPlayer, Mp3Player>();
container.RegisterType<IPlayer, CDPlayer>(); // 同一接口第二次註冊
var player = container.Resolve<IPlayer>(); // 獲取 CDPlayer(最後註冊者勝出)
多映射默認解析
圖 2:同接口多註冊,Resolve 取最後註冊

命名映射精確控制

container.RegisterType<IPlayer, Mp3Player>();
container.RegisterType<IPlayer, CDPlayer>("MyCD");
var p1 = container.Resolve<IPlayer>("MyCD"); // 獲取 CDPlayer
var p2 = container.Resolve<IPlayer>();      // 獲取 Mp3Player(默認映射)
命名映射解析
圖 3:命名映射精確選擇實現

注意:命名區分大小寫;同名多註冊同樣「最後勝出」。

ResolveAll:批量獲取所有命名映射

container.RegisterType<IPlayer, Mp3Player>("MP3");
container.RegisterType<IPlayer, CDPlayer>("CD");
container.RegisterType<IPlayer, DVDPlayer>(); // 無名映射
var players = container.ResolveAll<IPlayer>(); // 僅返回 MP3、CD 兩個命名實例
ResolveAll 輸出
圖 4:ResolveAll 僅收集有名映射

關鍵規則:ResolveAll 僅返回註冊時指定 Name 的映射實例,無名映射被忽略。

生命周期管理初識

註冊時指定 LifetimeManager 控制實例共享範圍:

  • ContainerControlledLifetimeManager:容器級單例
  • ExternallyControlledLifetimeManager:弱引用外部受控
  • 無指定:瞬態,每次新建

詳細機制參考《Unity LifetimeManager 深度解析》。

下一步學習路徑

  1. 掌握三種注入方式(構造函數/屬性/方法)
  2. 學習 XML 配置文件驅動註冊
  3. 理解容器層級結構與子容器隔離
  4. 探索擴展點:自定義 LifetimeManager、建構策略、攔截器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved