Unity Application Block 1.0系列(7): Lifetime Managers
来源:互联网 发布:人工智能的发展历史 编辑:程序博客网 时间:2024/05/16 19:53
Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁。
目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类。
1. ContainerControlledLifetimeManager
Unity保存一个指向对象实例的引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。也就是说实现了对象单例模式。默认情况下,RegisterInstance方法使用该Lifetime Manager。
2. ExternallyControlledLifetimeManager
Unity仅保存一个指向对象实例的弱引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。但是由于当对象创建完之后,容器没有对该对象的强引用,所以就可能出现当其他地方没有去强引用它时候,会被GC回收掉。
先看看一个接口和类,下面会用到
{
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容器不存在一个到该对象的引用。
看一个例子:
container.RegisterType<IPlayer, Mp3Player>();
IPlayer player1 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player1 HashCode: {0}",player1.GetHashCode()));
IPlayer player2 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player2 HashCode: {0}",player2.GetHashCode()));
输出结果:
通过输出的player1和player2对象的HashCode值可以看出,player1和player2分别是Mp3Player类的不同实例。
那怎样实现单例模式呢?
要实现单例模式,容器需要保存一个指向对象实例的引用。通过在RegisterType时为它指定相应的Lifetime Manager可以实现单例模式,从上面对ContainerControlledLifetimeManager和ExternallyControlledLifetimeManager的介绍可以知道,这两个Lifetime Manager都可以支持单例模式。
修改上面的代码为:
//这里指定使用ContainerControlledLifetimeManager对象
container.RegisterType<IPlayer, Mp3Player>(new ContainerControlledLifetimeManager());
IPlayer player1 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player1 HashCode: {0}",player1.GetHashCode()));
IPlayer player2 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player2 HashCode: {0}",player2.GetHashCode()));
看看输出:
通过输出结果可以看出,player1和player2对象为Mp3Player类的同一实例,指向同一内存地址。
2. RegisterInstance
当用RegisterInstance注册映射关系时,如果没有指定Lifetime Manager,默认是使用ContainerControlledLifetimeManager,即支持单例模式。
看个例子:
IPlayer mp3Player = new Mp3Player();
container.RegisterInstance<IPlayer>(mp3Player);
IPlayer player1 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player1 HashCode: {0}", player1.GetHashCode()));
IPlayer player2 = container.Resolve<IPlayer>();
Console.WriteLine(string.Format("Player2 HashCode: {0}", player2.GetHashCode()));
看看输出:
通过输出结果可以看出,player1和player2对象为Mp3Player类的同一实例,指向同一内存地址。
- Unity Application Block 1.0系列(7): Lifetime Managers
- [IoC容器Unity]第二回:Lifetime Managers生命周期
- [IoC容器Unity]第二回:Lifetime Managers生命周期
- Unity Application Block 1.0系列(1): 快速开始
- Unity Application Block 1.0系列(6): 杜绝循环引用
- Unity Application Block 1.0系列(2): 构造子注入(Constructor Injection)
- Unity Application Block 1.0系列(3): 属性/设值方法注入(Property/Setter Injection)
- Unity Application Block 1.0系列(4): 方法调用注入(Method Call Injection )
- Unity Application Block 发布
- Unity Application Block 配置文件
- Unity Application Block 1.0系列(5): 使用BuildUp让已存在对象实例也支持依赖注入
- Unity Application Block 小试
- Unity Application Block--通过配置文件读取映射
- Enterprise Library - Unity Application Block 学习手册
- Unity Application Block--通过配置文件读取映射
- Unity Application Block学习手册1
- Unity Application Block 学习手册2
- Unity Application Block 学习手册3
- 字符集编码详解
- C#_Queue实例
- linux shell编程学习记录
- Unity Application Block 1.0系列(6): 杜绝循环引用
- BEA weblogic 处理请求出现错误:Cannot parse POST parameters of request
- Unity Application Block 1.0系列(7): Lifetime Managers
- 其他字符集相关
- Hadoop 1.x 启动脚本学习(3)
- UVa 11489 Integer Game (博弈&想法题)
- 递归查询
- 阿里巴巴笔试题
- 四、android的单元测试
- android 在win7的cmd中输入adb shell提示不是内部或外部命令
- HDU 4727 The Number Off of FFF(2013年成都邀请赛)