zoukankan      html  css  js  c++  java
  • autofac生命周期

    什么是作用域和生命周期

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

      服务的 作用域 是指它在应用中能共享给其他组件并被消费的作用域. 例如, 在你的应用中你有个全局的静态单例 - 该全局对象实例的 "作用域" 将会是整个应用. 而如果你在一个代码块中创建了一个作用域,那么这个局部作用域就拥有比全局作用域小很多且更容易控制的作用域。

    在Autofac中的生命周期作用域其实把这两个概念组合到了一起。当我们创建了一个生命周期作用域时,我们可以在这个作用域中解析服务,对于不同的生命周期作用域服务是隔离开的,在工作单元最后, 你释放了相关的生命周期作用域然后Autofac将会自动清理/释放那些被解析的服务.

    注意:永远从一个生命周期作用域而不是从根容器中解析服务. 如果你从(根生命周期作用域)中解析了太多组件,无意间也许你就会造成内存泄漏

    实例作用域:

      1. 每一个依赖一个实例(Instance Per Dependency)

        在其他容器中也称为'transient'(瞬时),使用每个依赖的作用域,对于一个服务请求每次都会返回唯一的实例。如果没有指定特定的选项, 它将是默认的.

        例如我现在注册一个瞬时实例,尽管我们在同一生命周期作用域中解析这个组件,但它们返回是实例却都是唯一的。

      

      2. 单一实例 (Single Instance)

        它也被称为 '单例.' 使用单一实例作用域, 在根容器和所有嵌套作用域内所有的请求都将会返回同一个实例.

        例如我现在注册一个单一实例,我在不同的生命周期作用域中解析这个组件,它们返回的实例应该是相同的。

      

      3. 每个生命周期作用域一个实例 (Instance Per Lifetime Scope)

        对于平行存在的两个不同的生命周期作用域,他们获取的实例是不同的。对于嵌套的生命周期作用域的组件每个嵌套的生命周期作用域中最多只会有一个单一实例.

        如以下例子:在scope3和innerScope3这个嵌套生命周期作用域中最多只有一个ITestServiceA实例,所以他们获取的实例为同一个实例,输出为True。

              在scope1和scope2这两个平行的生命周期作用域中,ITestServiceA的实例为不同的实例。

       

      4. 每个匹配的生命周期作用域一个实例 (Instance Per Matching Lifetime Scope)

      这和上面的 '每个生命周期作用域一个实例' 的概念类似, 但可以对实例的共享有更加精准的控制.

      当你创建一个嵌套的生命周期作用域时, 你可以给作用域 "打标签" 或者 "命名" . 每个匹配生命周期作用域的组件在每个名称匹配的嵌套生命周期作用域中最多只会有一个单一实例. 

      这就允许了你创建一系列 "有作用域的单例" , 其他嵌套的生命周期可以在不声明一个共享实例的情况下共享这种组件的实例.

      

  • 相关阅读:
    Loadrunder场景设计篇——IP欺骗
    Loadrunner场景设计篇——负载生成器
    Loadrunder场景设计篇——定时器(schedule)
    2-SAT 及 一点习题
    如何A掉未来程序改
    NOI2015 寿司晚宴
    好玩的东西——一个代码片段
    后缀自动机
    Codeforces Round #313 (Div. 2)
    Codeforces Round #312 (Div. 2)
  • 原文地址:https://www.cnblogs.com/Xieyiincuit/p/14386827.html
Copyright © 2011-2022 走看看