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

Unity 依賴注入鍵值完整指南:類型映射與命名註冊技巧

     編輯:關於.NET

前言

在使用 Unity 容器創建對象之前,必須先完成容器的準備工作——即進行類型註冊(類型映射)。在前一篇文章中我們學習了如何透過配置檔案進行註冊,本文將深入探討如何使用程式碼實現各種註冊方式,這些功能同樣也能透過配置檔案達成。

Unity 容器的鍵值機制

Unity 應用程式區塊容器使用「鍵」搭配可選的「名稱」來識別註冊映射。鍵通常是一個介面或類別(多為基類)的類型名稱,它決定了實作或繼承的具體物件類型。此鍵標識了映射關係,使容器能在回應 Get 或 GetAll 呼叫時取得具體的物件類型。當同一類型存在多個映射時,可選的名稱用來區分這些映射,讓程式碼能指定要使用哪個類型映射。

核心註冊模式

1. 以介面類型作為依賴鍵

最常見的用法是使用介面類型作為註冊鍵。以下範例註冊了 IMyObject 介面對應到 MyRealObject 具體類別的映射:

IUnityContainer myContainer = new UnityContainer();
myContainer.Register<IMyObject, MyRealObject>();
IMyObject myRealObjectInstance = myContainer.Get<IMyObject>();

也可以使用非泛型多載達成相同效果:

IUnityContainer myContainer = new UnityContainer();
myContainer.Register(typeof(IMyObject), typeof(MyRealObject));
IMyObject myRealObjectInstance = myContainer.Get(typeof(IMyObject));

注意: 泛型與非泛型多載確保 Unity 可在不支援泛型的語言中使用,兩種寫法可隨意混合搭配。

2. 以物件類型名稱作為依賴鍵

當需要註冊基類或非介面類型的映射時,可使用接受物件類型名稱的多載:

IUnityContainer myContainer = new UnityContainer();
myContainer.Register<MyBaseObject, MyRealObject>();
MyBaseObject myRealObjectInstance = myContainer.Get<MyBaseObject>();

此時註冊鍵為 MyBaseObject,請求該鍵的程式碼將獲得 MyRealObject 實例(繼承自 MyBaseObject)。

3. 組合註冊鍵與命名註冊

若需為同一介面註冊多個實作,可指定名稱區分:

IUnityContainer myContainer = new UnityContainer();
myContainer.Register<IMyObject, MyFirstObject>("One");
myContainer.Register<IMyObject, MySecondObject>("Two");

IMyObject myFirstInstance = myContainer.Get<IMyObject>("One");
IMyObject mySecondInstance = myContainer.Get<IMyObject>("Two");

重要提醒: 註冊名稱區分大小寫,"Mymapping" 與 "MyMapping" 代表不同映射。

4. 單例模式的依賴鍵

使用 SetSingleton 方法註冊單例映射:

IUnityContainer myContainer = new UnityContainer();
myContainer.SetSingleton<MyObject>();
myContainer.SetSingleton<MyObject>("One");
myContainer.SetSingleton(typeof(MyObject), "Two");

容器將針對每個鍵/名稱組合維護單一實例。

5. 現有物件與 BuildUp 方法

RegisterInstance 允許註冊現有物件實例;BuildUp 則能對現有物件執行依賴注入。詳細用法請參考「理解和使用現有物件實例」。

6. 透過依賴鍵取得所有註冊類型

GetAll 方法回傳指定類型的所有具名註冊(不包含預設映射):

IUnityContainer myContainer = new UnityContainer();
myContainer.Register<IMyObject, MyDefaultObject>();
myContainer.Register<IMyObject, MyFirstObject>("One");
myContainer.Register<IMyObject, MySecondObject>("Two");

IEnumerable<IMyObject> objectList = myContainer.GetAll<IMyObject>();
// 僅包含 MyFirstObject 和 MySecondObject

關鍵點: 必須使用接受名稱參數的 Register、SetSingleton 或 RegisterInstance 多載進行註冊,GetAll 才能取得列表。

總結

掌握 Unity 的鍵值機制(型別鍵 + 可選名稱)是靈活運用依賴注入的核心。無論使用介面、基類、命名註冊或單例模式,理解這套映射系統才能在複雜專案中精準控制物件建立與生命週期。

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