猿教程 Logo

Autofac教程:控制范围和生命周期

您可以从注册组件的教程中回忆您将组件添加到实现服务的容器。 然后,您最终将解决服务并使用这些服务实例进行工作。

服务的生命周期是服务实例将在您的应用程序中生存多长时间 - 从原始实例化到处理。 例如,如果您“新建”一个实现IDisposable的对象,然后在其上调用Dispose(),则该对象的生命周期是从实例化一直到处理的时间(或者如果没有实现垃圾收集) 主动处置)。

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

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

寿命范围控制的两个重要事项是共享和处置。

  • 生命周期范围是可嵌套的,它们控制组件如何共享。 例如,“单身”服务可能会从根生存范围解决,而单个工作单位可能需要自己的其他服务实例。 您可以通过在注册时设置其实例范围来确定组件的共享方式。

  • 寿命范围跟踪一次性物品,并在生命周期范围被处置时处置它们。 例如,如果您有一个实现了IDisposable的组件,并且从一个生命周期的范围中解析出来,该范围将会保留在该组件上并将其处理,以便您的服务使用者不必了解底层实现。 如果您选择,您可以控制此行为或添加新的处置行为。

当您在应用程序中工作时,记住这些概念很好,因此您可以最有效地利用资源。

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

  • 您有一个全球单一登录服务。

  • 两个并发请求进入Web应用程序。

  • 每个请求都是逻辑的“工作单位”,每个请求都需要自己的订单处理服务。

  • 每个订单处理服务需要将信息记录到日志记录服务。

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

相关实例:

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

当每个请求结束时,请求生命周期范围结束并且相应的订单处理器被处理。 作为单身人士的伐木服务仍然活着,以备未来的要求进行分享。

您可以在Nick Blumhardt的Autofac终身引文中深入了解生命范围。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Autofac/lifetime-index.html