原文链接:http://docs.autofac.org/en/latest/lifetime/index.html

Lifetime 是指服务的实例在程序中存活多久 – 从最初的实例化到清理(disposal)。例如,一个实现 IDisposable 的对象,它的生命周期就是从实例化时开始,持续到调用它的 Dispose 时结束。(未主动调用 Disopose 则持续到被GC收集时)。

Scope 是指程序中的一块区域,在此区域内,服务可以被使用它的组件共享。例如,程序中全局的静态的单例对象,它的范围是整个程序。而在for循环里创建的本地变量,它的范围就要小的多。

Autofac 中的生命周期范围(lifetime scope)组合了这两个概念。实际上,可以把生命周期范围与应用程序中的工作单元等同起来。在工作单元的开始时创建生命周期范围,工作单元需要的服务从这个生命周期范围解析获得。解析服务时,Autofac 会跟踪实现 IDisposable 接口的组件。在工作单元结束时,清理(Dispose)生命周期范围,实现 IDisposable 接口的组件会同时被清理。

生命周期范围控制共享和清理:

  • 生命周期范围是可嵌套的,这控制组件如何被共享。例如,单例服务可以从根生命周期范围解析,而其他服务,则由各个工作单元请求自己的实例,在注册组件时,可以通过设置实例范围指定组件如何被共享。
  • 生命周期范围跟踪实现 IDisposable 接口的对象,这些对象随生命周期范围一起被清理。服务的使用者不需要了解底层实现。

编写程序时,了解这些概念有助于有效使用资源。

应始终从生命周期范围解析服务,而不是从根容器解析,这一点非常重要。由于生命周期范围对 IDisposable 处理方式,如果从容器(根生命周期范围)解析 IDisposable 对象,则可能不小心导致内存泄露。在根容器被清理前,它将一直持有对 IDisposable 对象的引用。

以下是一个具体的 web 示例,假设有以下场景:

  • 程序中有一个全局的单例日志服务。
  • 两个请求同时到达。
  • 每个请求是一个逻辑上的“工作单元”,需要各自独立的订单处理服务。
  • 每个订单处理服务都需要使用日志服务来打日志。

在这个场景中,根生命周期范围(容器)包含单例日志服务,每个请求对应一个子生命周期范围, 包含各自的订单处理服务:

+---------------------------------------------------+
| Autofac Container |
| Root Lifetime Scope |
| |
| Logging Service |
| (shared across all requests) |
| |
| +----------------------+ +----------------------+ |
| | First Request Scope | | Second Request Scope | |
| | | | | |
| | Order Processor | | Order Processor | |
| +----------------------+ +----------------------+ |
+---------------------------------------------------+

请求结束时,订单处理服务将随生命周期范围一同被清理。而日志服务是单例服务,将继续存活,供后续的请求使用。

[翻译] Autofac 控制范围和生命周期的更多相关文章

  1. 【C# .Net GC】手动监视和控制对象的生命周期(GCHandle)

    这个话题还未做详细研究,暂时用不到,只是粗略看了一下. 使用System.Runtime.InteropServices.GCHandle类来手动控制对象的生命周期 (个人感觉这里可能有一些问题... ...

  2. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...

  3. IoC之AutoFac(三)——生命周期

    阅读目录 一.Autofac中的生命周期相关概念 二.创建一个新的生命周期范围 三.实例周期范围 3.1   每个依赖一个实例(InstancePerDependency) 3.2  单个实例(Sin ...

  4. Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency

    InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象:每次都用同一个对象: In ...

  5. Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency 【转载】

    InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象:每次都用同一个对象: In ...

  6. ActivityLifecycleCallbacks 如何控制activity的生命周期

    Android开发 - ActivityLifecycleCallbacks使用方法初探 初识 ActivityLifecycleCallbacks 利用ActivityLifecycleCallba ...

  7. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  8. [翻译] Autofac 中注册的概念

    原文链接:http://docs.autofac.org/en/latest/register/registration.html 所谓注册组件,是指创建 ContainerBuilder 的实例,并 ...

  9. [翻译]Autofac 解析服务

    注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.Register ...

随机推荐

  1. [java] 找出字符串中出现最多的字符和出现的次数

    逛园子看到一童鞋做的华为上机题目,写来好长的代码,懒得看,感觉不可能这么难,于是动手敲了下. import java.util.Scanner; public class StringTest { / ...

  2. JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

    第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...

  3. JQuery uploadify 的使用

    在Java WEB项目中用到了上传图片的功能,于是百度了一下,发现 uploadify 的出镜率很高,于是决定使用这个插件.结果昨天调试了一天没有成功,今天早上仔细想了想,觉得应该是调用js文件的原因 ...

  4. 探讨js字符串数组拼接的性能问题

    这篇文章主要介绍了有关js对字符串数组进行拼接的性能问题,字符串连接一直是js中性能最低的操作之一,应该如何解决呢?请参看本文的介绍 我们知道,在js中,字符串连接是性能最低的操作之一. 例如: 复制 ...

  5. JSP网站开发基础总结《九》

    本篇属于附加篇,在之前的总结中给大家提到过一个关于登录状态验证的效果,当时是通过Session对象完成的,今天我查了一下,JSP为我们封装了一个用于过滤用的过滤器类Filter,通过它我们就可以非常轻 ...

  6. Angularjs 跳转页面并传递参数的方法总结

    http://www.zhihu.com/question/33565135 http://www.codeproject.com/Articles/1073780/ASP-NET-MVC-CRUD- ...

  7. 如何配置Hyper-V的虚拟机通过主机网络上网 (NAT)

    前言 最近开始在Windows 8 上面直接使用Hyper-V的技术来建立虚拟环境进行开发和测试,这样免去了再安装额外软件的需要.在实际使用的时候,尤其是配置网络共享的时候,遇到些问题,与其他一些虚拟 ...

  8. Pillow实现图片对比

    在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例.就像功能测试一样,当测试人员做了一些操作之后必然会判断实际结果是否等于预期结果,只不过,这个 ...

  9. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  10. Mac删除JDK

    安装了1.6以后,没有安装1.7发现Android Studio报错: invalid source release: JDK 1.7 原因是Android Studio需要1.7以上的版本,结果再次 ...