Unity默认提供了ContainerControlledLifetimeManager、TransientLifetimeManager、HierarchicalLifetimeManager、PerResolveLifetimeManager、PerThreadLifetimeManager和ExternallyControlledLifetimeManager。

ContainerControlledLifetimeManager 就是单例模式,在整个AppDomain中类型实例只有一个。

1 IUnityContainer unityContainer = new UnityContainer();
2
3 unityContainer.RegisterType<TextWriter, StringWriter>(new ContainerControlledLifetimeManager(), new InjectionConstructor());
4
5 TextWriter textWriter = unityContainer.Resolve<TextWriter>();
6 TextWriter textWriter2 = unityContainer.Resolve<TextWriter>();
7
8 Console.WriteLine(Object.ReferenceEquals(textWriter, textWriter2));

TransientLifetimeManager 每次都会创建一个类型的新实例。

1 IUnityContainer unityContainer = new UnityContainer();
2
3 unityContainer.RegisterType<TextWriter, StringWriter>(new TransientLifetimeManager(), new InjectionConstructor());
4
5 TextWriter textWriter = unityContainer.Resolve<TextWriter>();
6 TextWriter textWriter2 = unityContainer.Resolve<TextWriter>();
7
8 Console.WriteLine(Object.ReferenceEquals(textWriter, textWriter2));

HierarchicalLifetimeManager 单例模式,和ContainerControlledLifetimeManager不同的是子Container和祖先Container不共享类型实例。

1 IUnityContainer unityContainer = new UnityContainer();
2 IUnityContainer childUnityContainer = unityContainer.CreateChildContainer();
3
4 unityContainer.RegisterType<TextWriter, StringWriter>(new HierarchicalLifetimeManager(), new InjectionConstructor());
5
6 TextWriter textWriter = unityContainer.Resolve<TextWriter>();
7 TextWriter textWriter2 = childUnityContainer.Resolve<TextWriter>();

PerResolveLifetimeManager 和TransientLifetimeManager相同,每次调用Resolve函数都会返回新的类型实例。

1 IUnityContainer unityContainer = new UnityContainer();
2 IUnityContainer childUnityContainer = unityContainer.CreateChildContainer();
3
4 unityContainer.RegisterType<TextWriter, StringWriter>(new PerResolveLifetimeManager(), new InjectionConstructor());
5
6 TextWriter textWriter = unityContainer.Resolve<TextWriter>();
7 TextWriter textWriter2 = unityContainer.Resolve<TextWriter>();
8
9 Console.WriteLine(Object.ReferenceEquals(textWriter, textWriter2));

PerThreadLifetimeManager 和ThreadStaticAttribute一样,同一个线程共享一个类型实例。

 1 IUnityContainer unityContainer = new UnityContainer();
 2
 3 unityContainer.RegisterType<TextWriter, StringWriter>(new PerThreadLifetimeManager(), new InjectionConstructor());
 4
 5 TextWriter textWriter = null;
 6 TextWriter textWriter2 = null;
 7
 8 Semaphore semphore = new Semaphore(0, 2);
 9
10 new Thread(() =>
11 {
12   textWriter = unityContainer.Resolve<TextWriter>();
13   semphore.Release();
14 }).Start();
15
16 new Thread(() =>
17 {
18   textWriter2 = unityContainer.Resolve<TextWriter>();
19   semphore.Release();
20 }).Start();
21
22 semphore.WaitOne();
23
24 Console.WriteLine(Object.ReferenceEquals(textWriter, textWriter2));

ExternallyControlledLifetimeManager 类型共享同一个实例,内部对类型实例weak reference。类型实例的生命周期管理完全交给外部。

1 IUnityContainer unityContainer = new UnityContainer();
2
3 unityContainer.RegisterType<TextWriter, StringWriter>(new ExternallyControlledLifetimeManager(), new InjectionConstructor());
4
5 TextWriter textWriter = unityContainer.Resolve<TextWriter>();
6 TextWriter textWriter2 = unityContainer.Resolve<TextWriter>();
7
8 Console.WriteLine(Object.ReferenceEquals(textWriter, textWriter2));

转载于:https://www.cnblogs.com/junchu25/archive/2012/08/10/2631547.html

Unity Understanding Lifetime Managers相关推荐

  1. Unity Application Block 1.0系列(7): Lifetime Managers

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

  2. [IoC容器Unity]第三回:依赖注入

    上节介绍了,Unity的Lifetime Managers生命周期,Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍. 2.构造函数注入 Unity ...

  3. [IoC容器Unity]第四回:使用范例

    1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...

  4. Unity Application Block 1.0系列文章

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

  5. 微软企业库Unity学习笔记

    本文主要介绍: 关于Unity container配置,注册映射关系.类型,单实例.已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习 ...

  6. C#_深入理解Unity容器

    C#_深入理解Unity容器 一.背景 **DIP是依赖倒置原则:**一种软件架构设计的原则(抽象概念).依赖于抽象不依赖于细节 **IOC即为控制反转(Inversion of Control):* ...

  7. Gartner 2018 年WAF魔力象限报告:云WAF持续增长,Bot管理与API安全拥有未来

    Gartner 2018 年WAF魔力象限报告:云WAF持续增长,Bot管理与API安全拥有未来 来源 https://www.freebuf.com/articles/paper/184903.ht ...

  8. Process Stats:了解你的APP怎样使用内存

    原文地址:http://android-developers.blogspot.com/2014/01/process-stats-understanding-how-your.html?m=1 原作 ...

  9. 一篇文章读懂Unity内存 Understanding Memory on iOS

    孙广东   2018.5.26 Understanding Memory on iOS - What kind of memory? • Physical/Resident Memory • Grap ...

  10. 【Unity 粒子系统】Lifetime Speed 相关

    Lifetime && Speed 相关 今日龙族语录

最新文章

  1. 推荐算法——基于协同过滤CF
  2. centos和ubuntu安装卸载软件(rpm/dpkg)
  3. Maxscript中渲染中文版Vray完成贴图(VrayCompleteMap)的方法
  4. 牛客网华为机试考试java_牛客网——华为机试(题17:坐标移动)(Java)
  5. 【原创】Git版本控制器的基本使用
  6. RTMPDump源代码分析 0: 主要函数调用分析
  7. 存数组元素的个数_HashMap1.8之后为什么要采用数组+链表+红黑树的储存方式?
  8. rpo流程图模板_Visio Pro 2019下载-Microsoft Visio Pro(流程图制作软件)下载2019x64 简体中文版-西西软件下载...
  9. 黑客动画吧-黑客闯关之古墓探秘攻略
  10. 【UE4】特效之 Particle System 详解(二)—— 特效池
  11. 选对了裤长,胜过任何一件高级定制
  12. 从Docker镜像创建Singularity镜像(SIF文件)
  13. 二维码墓碑:可手机“扫”墓祭祖
  14. 我和王争学设计模式|原型模式
  15. python输出一年有多少天多少时分秒_python编程如何显示从1970年1月1日到今天多少天又多少小时...
  16. 同为IM社交产品中的王者,QQ与微信到底有什么区别
  17. 数据结构中的L=(List)malloc(sizeof(PtrToNode));是什么意思
  18. 服务器端口怎么调出虚拟键盘,Win8小技巧之如何设置触控虚拟键盘
  19. git上传代码和下载代码
  20. uni-app框架调研

热门文章

  1. 【转】What is an entity system framework for game development?
  2. 基于大并发抽奖的队列实现
  3. [报告]HDU 4343 Interval query
  4. android开机自启动程序设置
  5. Java的继承 以学生管理系统为例
  6. win7系统服务器错误404,Win7旗舰版系统下无法打开http://localhost出现404错误如何解决...
  7. python正则表达边界_Python之正则表达式
  8. 柱底反力求和lisp软件_基于AutoLisp语言的RC异形柱下独立基础验算方法与流程
  9. iphone查看删除的短信_手机里的短信不小心删除了怎么才能恢复?此文为你解答...
  10. php 三大魔术方法,PHP魔术方法