Autofac官方文档(十)【控制作用域和生命周期】

来源:互联网 发布:淘宝网商城首页登录 编辑:程序博客网 时间:2024/06/07 19:15

Nick Blumhardt的Autofac终身入门书是开始学习Autofac生命周期的好地方。然而,还有很多需要消化的东西,还有很多混杂的概念,所以我们将在这里补充这篇文章。

您可能会从注册主题中想起将组件添加到实现服务的容器。然后您最终解析服务并使用这些服务实例来完成您的工作。

服务的生命周期是服务实例在您的应用程序中生存的时间 - 从原始实例到处置。例如,如果你“新建”了一个实现了IDisposable的对象,然后再调用Dispose(),那么这个对象的生命周期就是从你实例化的时候开始的(或者垃圾回收,如果你没有主动处置它)。

服务范围是应用程序中可以与其他使用该服务的组件共享该服务的区域。例如,在你的应用程序中你可能有一个全局静态的单例 - 全局对象实例的“范围”将是整个应用程序。另一方面,您可以在使用全局单例的for循环中创建局部变量 - 局部变量的范围比全局范围小得多。

Autofac中的生命周期概念结合了这两个概念。有效地,生命周期的范围等同于您的应用程序中的一个工作单元。一个工作单位可能会在一启动就开始一个生命周期的范围,那么这个单位工作所需的服务将从生命周期作用域中解决。在解析服务问题时,Autofac跟踪已解析的一次性(IDisposable)组件。在工作单元结束时,您将处理关联的生命周期范围,Autofac将自动清理/处理已解析的服务。

The two important things lifetime scopes control are sharing and disposal.
生命周期管理的两件重要的事情就是分享和处置。

 生命周期范围是可嵌套的,它们控制组件如何共享。 例如,“单例”服务可能从根生命周期作用域解析,而单个工作单元可能需要自己的其他服务实例。 您可以通过在注册时设置其实例范围来确定组件的共享方式。 生命周期作用域可销毁的对象,并在释放生命周期作用域时予以销毁。 例如,如果您有一个实现了`IDisposable`的组件,并且您可以从生命周期范围解析它,则该范围将保留并为您处理,以便服务使用者不必知道底层实现。 如果您愿意,您可以控制此行为或添加新的处置行为。

在您的应用程序中工作时,最好记住这些概念,以便最有效地使用您的资源。

始终解析生命周期范围内的服务而非根容器很重要。 由于生命周期范围的处理跟踪特性,如果从容器中解析了大量的可销毁的组件(“根生命周期范围”),则可能会无意中造成内存泄漏。 根容器将持有对那些可销毁的组件的引用(通常是应用程序的生命周期),以便能够处理它们。 如果您选择,您可以更改处置行为,但是仅从范围解析是一个很好的做法。 如果Autofac检测到单例或共享组件的使用情况,它会自动将其放入适当的跟踪范围。

我们来看一个Web应用程序作为更具体的例子来说明生命周期范围的使用。 假设你有以下情况:

 你有一个全局的单例日志记录服务。 两个并发请求进入Web应用程序。 每个请求都是一个逻辑的“工作单元”,每个请求都需要自己的订单处理服务。 每个订单处理服务都需要将日信息记录到日志服务中。

在这种情况下,您将拥有包含单例记录服务的根生存期范围,并且每个请求都有一个子生命周期范围,每个范围都有自己的订单处理服务:

+---------------------------------------------------+|                 Autofac Container                 ||                Root Lifetime Scope                ||                                                   ||                  Logging Service                  ||            (     在所有请求中共享        )           ||                                                   || +----------------------+ +----------------------+ || |  First Request Scope | | Second Request Scope | || |                      | |                      | || |   Order Processor    | |   Order Processor    | || +----------------------+ +----------------------+ |+---------------------------------------------------+

When each request ends, the request lifetime scope ends and the respective order processor gets disposed. The logging service, as a singleton, stays alive for sharing by future requests.
当每个请求结束时,请求生命周期范围结束,相应的订单处理器被销毁。 日志记录服务作为一个单例对象,在将来的请求中保持共享。

您可以在Nick Blumhardt的Autofac生命周期入门书的生命周期作用域中进一步深入。

额外的终身范围主题探索:

Working with Lifetime Scopes    Creating a New Lifetime Scope    Tagging a Lifetime Scope    Adding Registrations to a Lifetime ScopeInstance Scope    Instance Per Dependency    Single Instance    Instance Per Lifetime Scope    Instance Per Matching Lifetime Scope    Instance Per Request    Instance Per Owned    Thread ScopeCaptive Dependencies    General Rule    Simple Example    Code Example    Exception to the RuleDisposal    Registering Components        Automatic Disposal        Specified Disposal        Disabling Disposal    Resolve Components from Lifetime Scopes    Child Scopes are NOT Automatically Disposed    Advanced HierarchiesLifetime Events    OnActivating    OnActivated    OnReleaseRunning Code at Startup    Startable Components    Auto-Activated Components    Container Build Callbacks
原创粉丝点击