


























Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁。
目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类。
1. ContainerControlledLifetimeManager
Unity保存一个指向对象实例的引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。也就是说实现了对象单例模式。默认情况下,RegisterInstance方法使用该Lifetime Manager。
先看看一个接口和类,下面会用到
public interface IPlayer
{
void Play();
}public class Mp3Player : IPlayer
{
public void Play()
{
Console.WriteLine("Playing Mp3");
}
}
接下来通过在RegisterType和RegisterInstance时指定相应的Lifetime Manager来介绍Lifetime Manager的应用场景。
1. RegisterType
当用RegisterType注册映射关系时,如果没有指定LifetimeManager,默认是使用一个瞬态的Lifetime Manager。即每次通过Unity容器获取对象的实例时都会重新创建一个该实例,也就是说Unity容器不存在一个到该对象的引用。
看一个例子:
IUnityContainer container = new UnityContainer();
container.RegisterType
<IPlayer, Mp3Player>();IPlayer player1
= container.Resolve<IPlayer>();IPlayer player2
= container.Resolve<IPlayer>();输出结果:
通过输出的player1和player2对象的HashCode值可以看出,player1和player2分别是Mp3Player类的不同实例。
那怎样实现单例模式呢?
要实现单例模式,容器需要保存一个指向对象实例的引用。通过在RegisterType时为它指定相应的Lifetime Manager可以实现单例模式,从上面对ContainerControlledLifetimeManager和ExternallyControlledLifetimeManager的介绍可以知道,这两个Lifetime Manager都可以支持单例模式。
修改上面的代码为:
IUnityContainer container = new UnityContainer();//这里指定使用ContainerControlledLifetimeManager对象
container.RegisterType<IPlayer, Mp3Player>(new ContainerControlledLifetimeManager());
IPlayer player1
= container.Resolve<IPlayer>();IPlayer player2
= container.Resolve<IPlayer>();
看看输出:

通过输出结果可以看出,player1和player2对象为Mp3Player类的同一实例,指向同一内存地址。
2. RegisterInstance
当用RegisterInstance注册映射关系时,如果没有指定Lifetime Manager,默认是使用ContainerControlledLifetimeManager,即支持单例模式。
看个例子:
IUnityContainer container = new UnityContainer();
IPlayer mp3Player
= new Mp3Player();IPlayer player1
= container.Resolve<IPlayer>();IPlayer player2
= container.Resolve<IPlayer>();看看输出:

通过输出结果可以看出,player1和player2对象为Mp3Player类的同一实例,指向同一内存地址。
作者:Inrie (洪晓军)
出处:http://www.cnblogs.com/inrie
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。