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

Unity 容器生命周期管理深度解析:從單例到弱引用的實戰選型

     編輯:關於.NET

LifetimeManager:對象存活的掌舵者

Unity 通過繼承 LifetimeManager 的具體類型控制實例引用持有方式與銷毀時機。內置兩大管理器覆蓋主流場景:

1. ContainerControlledLifetimeManager——容器級單例

  • 容器持有強引用,生命周期與容器綁定
  • 多次 Resolve 返回同一實例,實現單例模式
  • RegisterInstance 默認採用此管理器

2. ExternallyControlledLifetimeManager——外部受控弱引用

  • 容器僅持有弱引用,不阻止 GC 回收
  • 同樣返回同一實例,但若外部無強引用,實例可能被回收
  • 適用於需外部管理生命周期(如緩存、作用域容器)的場景

代碼實證:HashCode 驗證實例同一性

定義接口與實現:

public interface IPlayer { void Play(); }
public class Mp3Player : IPlayer {
    public void Play() => Console.WriteLine("Playing Mp3");
}

場景一:RegisterType 默認瞬態(每次新建)

var container = new UnityContainer();
container.RegisterType<IPlayer, Mp3Player>();
var p1 = container.Resolve<IPlayer>();
var p2 = container.Resolve<IPlayer>();
Console.WriteLine($"P1 Hash: {p1.GetHashCode()}, P2 Hash: {p2.GetHashCode()}");
// 輸出不同 HashCode,證實為不同實例
瞬態模式輸出
圖 1:默認瞬態模式,每次解析創建新實例

場景二:指定 ContainerControlledLifetimeManager 實現單例

container.RegisterType<IPlayer, Mp3Player>(new ContainerControlledLifetimeManager());
var p1 = container.Resolve<IPlayer>();
var p2 = container.Resolve<IPlayer>();
Console.WriteLine($"P1 Hash: {p1.GetHashCode()}, P2 Hash: {p2.GetHashCode()}");
// 輸出相同 HashCode,確認為同一實例
單例模式輸出
圖 2:容器管理單例,多次解析返回同一引用

場景三:RegisterInstance 默認單例行為

var container = new UnityContainer();
var mp3 = new Mp3Player();
container.RegisterInstance<IPlayer>(mp3); // 隱式使用 ContainerControlledLifetimeManager
var p1 = container.Resolve<IPlayer>();
var p2 = container.Resolve<IPlayer>();
// 同樣輸出相同 HashCode
RegisterInstance 輸出
圖 3:RegisterInstance 默認單例語義

選型指南與最佳實踐

管理器引用類型適用場景注意事項
ContainerControlledLifetimeManager強引用真正單例、有狀態服務、昂貴資源共享容器銷毀前實例不釋放,注意內存佔用
ExternallyControlledLifetimeManager弱引用緩存場景、外部作用域管理、需配合 GC 的對象實例可能意外消失,Resolve 時需檢查 null
無指定(默認)無引用無狀態服務、輕量級對象、每次需全新實例高頻調用可能帶來 GC 壓力

自定義 LifetimeManager 可實現請求級、會話級、線程級等進階作用域,滿足 Web 應用複雜生命周期需求。

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