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

Unity 1.x 容器初始化完全指南:註冊 API、生命周期、層級容器與配置驅動

     編輯:關於.NET

初始化核心:類型註冊與生命周期綁定

Unity 容器啟動階段完成兩件事:建立契約→實現映射、綁定生命周期策略。本文以 IDialer/Dialer/ButtonDialer/PlateDialer/Telephone 模型演示。

生命周期管理器:對象存活的守門人

管理器引用策略實例共享範圍適用場景
ContainerControlledLifetimeManager強引用容器級單例有狀態服務、昂貴資源、配置對象
ExternallyControlledLifetimeManager弱引用容器不阻止 GC,外部控制緩存、作用域外部管理、需配合 GC
無指定(默認)無引用瞬態,每次新建無狀態服務、輕量對象、請求級隔離

註冊時指定:RegisterType<TFrom,TTo>(new ContainerControlledLifetimeManager())。

RegisterType 註冊類型映射——API 全景

基礎註冊:默認映射 + 瞬態

container.RegisterType<IDialer, ButtonDialer>();
container.RegisterType<Dialer, ButtonDialer>(); // 基類映射同理
// 每次 Resolve 創建新實例
基礎註冊輸出
圖 1:默認瞬態註冊,每次解析新實例

指定生命周期:單例語義

container.RegisterType<IDialer, ButtonDialer>(new ContainerControlledLifetimeManager());
// 首次 Resolve 創建,後續復用同一實例
單例輸出
圖 2:ContainerControlled 實現單例復用

命名映射:多實現共存

container.RegisterType<IDialer, ButtonDialer>("Button");
container.RegisterType<IDialer, PlateDialer>("Plate");
// 解析時指定名稱:Resolve<IDialer>("Button")
命名映射輸出
圖 3:命名映射註冊與解析

組合註冊:命名 + 生命周期

container.RegisterType<IDialer, ButtonDialer>("Button", new ContainerControlledLifetimeManager());

RegisterInstance 註冊現有實例

默認單例註冊

var dialer = new ButtonDialer();
container.RegisterInstance<Dialer>(dialer); // 隱式 ContainerControlled
// 後續 Resolve 返回同一 dialer 實例
RegisterInstance 輸出
圖 4:RegisterInstance 默認單例行為

配置文件註冊實例需類型轉換器

```xml ```

客戶端需載入配置並 Resolve(Type) 指定契約類型。

容器層級結構:父子容器隔離與繼承

應用場景

  • 同一契約需不同生命周期(如全局單例 vs 請求級)
  • 模塊隔離:子容器註冊覆蓋父容器,父容器共享基礎設施
  • 臨時映射:子容器承載短生命周期註冊,銷毀子容器自動清理

代碼構建層級

var parent = new UnityContainer();
parent.RegisterType<IDialer, ButtonDialer>(new ContainerControlledLifetimeManager());

var child = parent.CreateChildContainer();
child.RegisterType<IDialer, PlateDialer>(); // 子容器覆蓋,瞬態

// 子容器解析:優先查找自己,再向上委托父容器
var dialer1 = child.Resolve<IDialer>(); // PlateDialer (子容器)
var dialer2 = parent.Resolve<IDialer>(); // ButtonDialer (父容器)
層級容器輸出
圖 5:父子容器映射隔離與繼承

配置文件支持層級容器

```xml ...基礎設施映射... ...臨時/覆蓋映射... ```

客戶端:var child = container.CreateChildContainer(); section.Containers["ChildContainer"].Configure(child);

配置層級容器
圖 6:配置文件定義父子容器

XML 配置驅動註冊完整流程

  1. 定義 configSections 引用 UnityConfigurationSection
  2. <unity> 區塊聲明 typeAliases、containers、typeConverters
  3. 客戶端:var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); section.Configure(container);

API 快速查閱表

方法組核心簽名關鍵參數
RegisterTypeRegisterType<TFrom,TTo>(name, lifetime)name/生命周期/泛型非泛型
RegisterInstanceRegisterInstance<T>(instance, name, lifetime)instance/name/生命周期
子容器CreateChildContainer() / Dispose()父子隔離/繼承解析

掌握註冊 API 與生命周期組合,是驾馭 Unity 容器的基石。

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