控制作用域和生命周期¶

这个有一篇学习Autofac控制作用域和生命周期很好的文章 Nick Blumhardt's Autofac lifetime primer. 里面有很多东西可以学习, 并且有很多混合的概念, 因此我们尝试在这边对该文做些补充.

回忆下 注册章节 , 你向容器中添加了一个实现 服务 的 组件 . 最后 解析服务 并且使用这些服务的实例来完成一些事.

服务的 生命周期 是指服务实例在你的应用中存在的时长 - 从开始实例化到最后 释放 结束. 例如, 如果你 "new up" 了一个 实现 IDisposable 的对象并且之后调用了它的 Dispose() 方法, 对象的生命周期是从你实例化一直到释放 (或者是被垃圾回收, 如果你没有提前释放它的话).

服务的 作用域 是指它在应用中能共享给其他组件并被消费的作用域. 例如, 在你的应用中你有个全局的静态单例 - 该全局对象实例的 "作用域" 将会是整个应用. 另一方面, 如果你在一个 for 循环中创建了引用了全局单例的一个局部变量 - 那么这个局部变量就拥有比全局变量小很多的作用域.

Autofac中 生命周期作用域 的概念其实是把这两个概念组合在了一起. 实际上, 生命周期作用域等同于你应用中的一个工作单元. 一个工作单元将会在开始时启动生命周期作用域, 然后需要该工作单元的服务被从生命周期作用域中解析出. 当你解析服务时, Autofac将会追踪被解析的可释放/可销毁 (IDisposable) 组件. 在工作单元最后, 你释放了相关的生命周期作用域然后Autofac将会自动清理/释放那些被解析的服务.

生命周期控制作用域的两个要素是共享和释放.

生命周期作用域是可嵌套的并且它们控制了组件如何共享. 例如, 一个 "单例" 服务也许会从根生命周期解析因为每个独立的工作单元会需要它们各自的服务实例. 你可以通过 注册时设置实例作用域 决定组件如何共享.

生命周期作用域追踪可释放对象并且当生命周期作用域被释放同时释放它们. 例如, 如果你有个实现 IDisposable 的组件并且你从生命周期中解析了它, 生命周期作用域将会保持住它并且替你释放它, 这样你的服务消费者就不必知道它的内在具体实现. 你有能力选择控制该行为或者添加一个新的释放行为.

在你的应用中, 最好记住以下概念这样就能有效使用你的资源.

永远从一个生命周期作用域而不是从根容器中解析服务. 由于生命周期作用域有追踪可释放资源的性质, 如果你从一个容器 ("根生命周期作用域") 中解析了太多组件, 无意间也许你就会造成内存泄露. 根生命周期会在它存在的时间 (通常是应用的生命周期) 内保持住可释放组件因此它也能释放它们. 你可以选择性的改变释放行为, 但从作用域内解析是个良好的实践. 如果Autofac检测到使用单例或共享组件, 它会自动把它们安放在一个合适的追踪作用域之内.

让我们看下web类应用, 把它作为一个更好阐述生命周期作用域的具体例子. 假设有以下场景:

你有一个全局的单例logging服务.

两个请求同时进入到web应用中.

每个请求是一个逻辑上的 "工作单元" 并且每个请求需要它们各自的order processing service.

每个order processing service 要用 logging service 记录信息.

在这种场景中, 你有一个根作用域, 包含单例的logging service并且每个请求有一个子生命周期, 每个有它们自己的order processing service:

+---------------------------------------------------+

| Autofac Container |

| Root Lifetime Scope |

| |

| Logging Service |

| (shared across all requests) |

| |

| +----------------------+ +----------------------+ |

| | First Request Scope | | Second Request Scope | |

| | | | | |

| | Order Processor | | Order Processor | |

| +----------------------+ +----------------------+ |

+---------------------------------------------------+

每个请求结束时, 请求的生命周期也结束并且各自的订单处理程序得到释放. logging service作为一个单例, 将会保持存在并以备后续请求共享.

更多生命周期作用域相关章节:

autofac 作用域_控制作用域和生命周期相关推荐

  1. 【Java】变量的分类(作用域,初始值,生命周期)

    1. 变量的分类 变量根据在类中定义位置的不同,可以分为两大类: 成员变量:全局变量/字段(Field),不要称之为属性(错误),直接定义在类中,方法外面: (1)类成员变量:使用static修饰符: ...

  2. SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession作用域(Scope)和生命周期

    可以说每个MyBatis都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory实例可以通过SqlSessionFactoryBuilder来构建.一是可以通过XM ...

  3. js字符串替换_浅析Vue的生命周期以及JS异步

    前言 Vue的生命周期和JS异步都是有很多文章的知识点,我之前也是一知半解,基本够用. 但是直到我在开发的时候真的遇到了问题,才发现如果不把这些知识点融汇到一起,很难解决实际问题. 我甚至觉得这是我离 ...

  4. 数据科学生命周期_数据科学项目生命周期第1部分

    数据科学生命周期 This is series of how to developed data science project. 这是如何开发数据科学项目的系列. This is part 1. 这 ...

  5. 软件开发生命周期中的设计阶段_什么是软件生命周期模型?软件测试和软件开发的关系分析!...

    软件生命周期这个词,对于大部分人应该比较陌生,但却不容忽视!正因为它的重要性,才有许多不同的软件开发生命周期模型,但是它们都有一个共同的特点,那就是在生命周期中的某一时刻,软件都会被测试.今天我就和大 ...

  6. er图用什么软件_从软件开发生命周期看商业智能 BI 数据仓库建模

    关于商业智能 BI 的介绍面对不同的企业客户可以从很多不同的角度展开,比如从业务角度.管理角度.数据架构角度.IT 信息化建设角度.BI 实施方法论角度等,不同的视角可以帮助企业更加全面的了解商业智能 ...

  7. 互联网产品生命周期_我市扎实推进全生命周期公共法律服务产品研发

    近日,江苏省司法厅公布全省企业全生命周期公共法律服务产品研发评选活动结果,我市司法局.公证处报送的"区块链+公证赋强平台"产品,以总分第一的好成绩荣获全省一等奖. 近年来,市司法局 ...

  8. 周期性行业是什么意思_什么是行业生命周期?行业生命周期是什么意思?

    行业生命周期是什么意思?所谓行业生命周期,指的是一个行业从成长到衰退的整个发展过程.行业生命周期是什么意思?行业的生命周期一般分为初创期.成长期.稳定期和衰退期四个阶段,在行业生命周期的不同阶段,由于 ...

  9. 玩家生命周期如何设计?_分析与玩家生命周期

    玩家生命周期如何设计? Using data to improve your game's retention and revenue 使用数据提高游戏的保留率和收益 The innovations ...

最新文章

  1. WPF加载程序集中字符串资源
  2. 【Spring注解系列14】@Profile进行环境切换
  3. 数据结构实验之图论四:迷宫探索_用图机器学习探索 A 股个股相关性变化
  4. 与Min_25筛有关的一些模板
  5. java input是什么意思_java中的【...】表示什么意思
  6. 初读JavaScript DOM编程艺术(一)
  7. hive 如何将数组转成字符串_hive 将hive表数据查询出来转为json对象和json数组输出...
  8. Angular官方教程采坑
  9. Linux首次登陆设置root
  10. 1次订单事故,扣了我3个月绩效!
  11. CSDN下载频道积分2.0
  12. 尚硅谷视频讲解:多态性
  13. Win10预览版已经支持WSL的带GUI的应用
  14. 宝塔面板的数据库地址配置
  15. 吕广渝:上帝视角看公司运营
  16. jenkins配置svn提交一键自动部署
  17. MySQL中用户订单复购率的计算
  18. 顺序的分数 Ordered Fractions [USACO 2.1]
  19. 【C#】记录一次上位机软件界面闪退分析及解决方案
  20. Python语音合成探究(一、男声和女声的选择)

热门文章

  1. [Hive_6] Hive 的内置函数应用
  2. pwa程序,清单文件测试有效,为什么不起效果?
  3. Spring IOC 容器源码分析系列文章导读 1
  4. 流量银行与阿里联手放大招 1毛钱换1块钱
  5. hadoop中datanode无法启动,报Caused by: java.net.NoRouteToHostException: No route to host
  6. android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事...
  7. S3 Texture Compression
  8. maven实战笔记-12
  9. 妙用 background 实现花式文字效果
  10. Spring中的InitializingBean的使用详解