// 1. 創建容器
IUnityContainer container = new UnityContainer();
// 2. 註冊類型映射:IPlayer → Mp3Player
container.RegisterType<IPlayer, Mp3Player>();
// 3. 解析獲取實例,容器自動構造 Mp3Player 並注入其依賴
IPlayer player = container.Resolve<IPlayer>();
// 4. 使用對象
player.Play(); // 輸出: Playing Mp3
Resolve 由容器新建實例(默認瞬態)container.RegisterType<IPlayer, Mp3Player>("MyMp3")LifetimeManager、非泛型版本等ContainerControlledLifetimeManager(容器級單例)container.RegisterInstance<IPlayer>("MyMp3", mp3Instance)| 方法 | 行為 |
|---|---|
Resolve<T>() | 獲取默認映射實例 |
Resolve<T>(name) | 獲取指定命名映射實例 |
Resolve(type) / Resolve(type, name) | 非泛型版本,動態類型場景 |
container.RegisterType<IPlayer, Mp3Player>();
container.RegisterType<IPlayer, CDPlayer>(); // 同一接口第二次註冊
var player = container.Resolve<IPlayer>(); // 獲取 CDPlayer(最後註冊者勝出)
container.RegisterType<IPlayer, Mp3Player>();
container.RegisterType<IPlayer, CDPlayer>("MyCD");
var p1 = container.Resolve<IPlayer>("MyCD"); // 獲取 CDPlayer
var p2 = container.Resolve<IPlayer>(); // 獲取 Mp3Player(默認映射)
注意:命名區分大小寫;同名多註冊同樣「最後勝出」。
container.RegisterType<IPlayer, Mp3Player>("MP3");
container.RegisterType<IPlayer, CDPlayer>("CD");
container.RegisterType<IPlayer, DVDPlayer>(); // 無名映射
var players = container.ResolveAll<IPlayer>(); // 僅返回 MP3、CD 兩個命名實例
關鍵規則:ResolveAll 僅返回註冊時指定 Name 的映射實例,無名映射被忽略。
註冊時指定 LifetimeManager 控制實例共享範圍:
ContainerControlledLifetimeManager:容器級單例ExternallyControlledLifetimeManager:弱引用外部受控詳細機制參考《Unity LifetimeManager 深度解析》。