在使用 Unity 容器創建對象之前,必須先完成容器的準備工作——即進行類型註冊(類型映射)。在前一篇文章中我們學習了如何透過配置檔案進行註冊,本文將深入探討如何使用程式碼實現各種註冊方式,這些功能同樣也能透過配置檔案達成。
Unity 應用程式區塊容器使用「鍵」搭配可選的「名稱」來識別註冊映射。鍵通常是一個介面或類別(多為基類)的類型名稱,它決定了實作或繼承的具體物件類型。此鍵標識了映射關係,使容器能在回應 Get 或 GetAll 呼叫時取得具體的物件類型。當同一類型存在多個映射時,可選的名稱用來區分這些映射,讓程式碼能指定要使用哪個類型映射。
最常見的用法是使用介面類型作為註冊鍵。以下範例註冊了 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 可在不支援泛型的語言中使用,兩種寫法可隨意混合搭配。
當需要註冊基類或非介面類型的映射時,可使用接受物件類型名稱的多載:
IUnityContainer myContainer = new UnityContainer();
myContainer.Register<MyBaseObject, MyRealObject>();
MyBaseObject myRealObjectInstance = myContainer.Get<MyBaseObject>();
此時註冊鍵為 MyBaseObject,請求該鍵的程式碼將獲得 MyRealObject 實例(繼承自 MyBaseObject)。
若需為同一介面註冊多個實作,可指定名稱區分:
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" 代表不同映射。
使用 SetSingleton 方法註冊單例映射:
IUnityContainer myContainer = new UnityContainer();
myContainer.SetSingleton<MyObject>();
myContainer.SetSingleton<MyObject>("One");
myContainer.SetSingleton(typeof(MyObject), "Two");
容器將針對每個鍵/名稱組合維護單一實例。
RegisterInstance 允許註冊現有物件實例;BuildUp 則能對現有物件執行依賴注入。詳細用法請參考「理解和使用現有物件實例」。
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 的鍵值機制(型別鍵 + 可選名稱)是靈活運用依賴注入的核心。無論使用介面、基類、命名註冊或單例模式,理解這套映射系統才能在複雜專案中精準控制物件建立與生命週期。