022.NET5_Autofac生命周期
Autofac生命周期
什么是作用域和生命周期?
服务的 生命周期 是指服务实例在你的应用中存在的时长 - 从开始实例化到最后释放结束. 例如, 如果你 "new up" 了一个 实现 IDisposable 的对象并且之后调用了它的 Dispose()
方法, 对象的生命周期是从你实例化一直到释放 (或者是被垃圾回收, 如果你没有提前释放它的话).
服务的 作用域 是指它在应用中能共享给其他组件并被消费的作用域. 例如, 在你的应用中你有个全局的静态单例 - 该全局对象实例的 "作用域" 将会是整个应用. 而如果你在一个代码块中创建了一个作用域,那么这个局部作用域就拥有比全局作用域小很多且更容易控制的作用域。
在Autofac中的生命周期作用域其实把这两个概念组合到了一起。当我们创建了一个生命周期作用域时,我们可以在这个作用域中解析服务,对于不同的生命周期作用域服务是隔离开的,在工作单元最后, 你释放了相关的生命周期作用域然后Autofac将会自动清理/释放那些被解析的服务.
Autofac有7大生命周期。
1.瞬间生命周期(transient):每一次获取到都是全新的实例。
例如我现在注册一个瞬时实例,尽管我们在同一生命周期作用域中解析这个组件,但它们返回是实例却都是唯一的。
2. 单例生命周期(Single Instance):一个进程中获取都是同一个实例
它也被称为 '单例.' 使用单一实例作用域, 在根容器和所有嵌套作用域内所有的请求都将会返回同一个实例.
例如我现在注册一个单一实例,我在不同的生命周期作用域中解析这个组件,它们返回的实例应该是相同的。
3.每个生命周期范围,一个实例(Instance Per Lifetime Scope)
对于平行存在的两个不同的生命周期作用域,他们获取的实例是不同的。对于嵌套的生命周期作用域的组件每个嵌套的生命周期作用域中最多只会有一个单一实例.
4. 每个匹配生命周期范围内一个实例(Instance Per Matching Lifetime Scope)
这和上面的 '每个生命周期作用域一个实例' 的概念类似, 但可以对实例的共享有更加精准的控制.
当你创建一个嵌套的生命周期作用域时, 你可以给作用域 "打标签" 或者 "命名" . 每个匹配生命周期作用域的组件在每个名称匹配的嵌套生命周期作用域中最多只会有一个单一实例.
这就允许了你创建一系列 "有作用域的单例" , 其他嵌套的生命周期可以在不声明一个共享实例的情况下共享这种组件的实例.