Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁。

目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类。

1. ContainerControlledLifetimeManager

Unity保存一个指向对象实例的引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。也就是说实现了对象单例模式。默认情况下,RegisterInstance方法使用该Lifetime Manager。

2. ExternallyControlledLifetimeManager

Unity仅保存一个指向对象实例的弱引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。但是由于当对象创建完之后,容器没有对该对象的强引用,所以就可能出现当其他地方没有去强引用它时候,会被GC回收掉。

先看看一个接口和类,下面会用到

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>();
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都可以支持单例模式。

修改上面的代码为:

IUnityContainer container = new UnityContainer();

//这里指定使用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,即支持单例模式。

看个例子:

IUnityContainer container = new UnityContainer();

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类的同一实例,指向同一内存地址。

作者:Inrie (洪晓军)
出处:http://www.cnblogs.com/inrie

转载于:https://www.cnblogs.com/inrie/archive/2008/04/20/1161831.html

Unity Application Block 1.0系列(7): Lifetime Managers相关推荐

  1. Unity Application Block 1.0系列文章

    Unity Application Block (Unity) 是微软 Patterns & Practices  团队开发的一个轻量级.可扩展的依赖注入容器,有助于构建松散耦合的系统.它支持 ...

  2. Unity Application Block 1.2 学习笔记 [转]

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  3. Unity Application Block 1.2 学习笔记(zhuan)

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  4. Unity Application Block 1.2 学习笔记

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  5. Unity Application Block 3月12 发布的版本

    3月12日,Unity 又发布了正式发布之前的版本,这个版本提供了安装程序.并且提供了一个依赖注入在实现方式:Setter injection 的配置API.之前发布的版本,属性注入需要用[Depen ...

  6. Unity Application Block 发布

    今天Unity Application Block提前发布了,翻译一下下文纪念一下. 顺便推荐看看我整理的Castle方面的资料开源框架:Castle,这有助于你理解和使用Unity Applicat ...

  7. Updater Application Block v1.0 翻译文档目录

    为方便大家阅读有关Updater Application Block v1.0 的翻译文章,在本文中列出最近翻译的相关文章目录. Updater Application Block v1.0 介绍 U ...

  8. 微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2

    微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2,具体可参看InfoQ的新闻http://www.infoq.com/cn/n ...

  9. User Interface Process(UIP) Application Block 2.0 研究总结

    By Ben User Interface Process (UIP) Application Block - Version 2.0 环境: WinXP, SQL Server 2000 + SP ...

最新文章

  1. 第十二篇:形式语言理论与有限状态自动机
  2. 10 个最值得 Python 新人练手的有趣项目 | 赠书
  3. 显卡测试软件3d mark,显卡评测工具3DMark跑分结果变了:可以直接PK同等配置
  4. python3.7安装pip问题_python3.7安装, 解决pip is configured with locations that require TLS/SSL问题...
  5. jupyter notebook 主题
  6. 一个逐步“优化”的范例程序(转)
  7. C++ 类设计核查表
  8. yii 引用php文件,Yii中引出php文件及插件
  9. 搭建tidb集群linux_无服务器计算,学习Go,Linux系统恢复,TiDB,Udev等
  10. 第二十单元 计划任务crond服务
  11. 学习linux/unix编程方法的建议-转
  12. java 方法绑定_java 方法调用绑定
  13. java win8 mac地址_Win8系统查看mac地址的两种方法
  14. eprime2.0 倒计时功能
  15. android获取浏览器cookie,获取浏览器cookie
  16. 高性能图像放大算法——waifu2x方法
  17. 中国行政区域shp shx csv 等地图数据下载
  18. 计算机热启动方法,关于电脑热启动的介绍
  19. centos查看CPU温度
  20. centos 安装Times New Roman

热门文章

  1. sql语句distinct_带DISTINCT子句SQL SELECT语句
  2. mean python_Python mean()方法的详细指南
  3. c语言中优先级队列_C ++中的优先级队列
  4. sql关键字_SQL关键字
  5. camerax_Android CameraX OpenCV图像处理
  6. 苹果x翻新机序列号开头_Android翻新电话每隔X秒
  7. Java中的System.exit()
  8. LeetCode之3Sum Closest(Kotlin)
  9. HTML5中Audio使用踩坑汇总
  10. linux 3.10的kdump配置的小坑