首页 > 解决方案 > 常规生命周期范围内的 Autofac IAsyncDisposable 支持

问题描述

我想知道 Autofac 如何处理具有常规生命周期的 IAsyncDisposable 。

假设我们有一个通过以下方式注册的组件

builder.RegisterType<DnsResolutionService>()
    .As<IDnsResolutionService>()
    .SingleInstance();

在阅读文档时,我发现以下内容:

如果您实施 IAsyncDisposable,则不必实施 IDisposable,但我们强烈建议您这样做。如果你的组件只实现了 IAsyncDisposable,但是有人同步地释放了作用域,那么 Autofac 会抛出一个异常,因为它不知道如何释放你的组件。

我现在有点困惑,基本上我脑子里有两个问题:

  1. 添加到注册的常规生命周期范围是否完全支持异步处理?或者只有当我明确使用类似的东西时才会发生同步处理using(var scope = container.BeginLifetimeScope())- 由于只使用构造函数注入,我实际上基本上从未使用过。

  2. 如果某些东西实际上会尝试处置我的组件,该组件将同时实现IDisposableIAsyncDisposable,正如文档所建议的那样,以同步方式,那么它可能只会调用 IDisposable。在这种情况下,我是否也必须在同步处置块中处置所有 IAsyncDisposables?Autofac 是否提供任何类型的命令,例如首先调用 IAsyncDisposable,所以我也许可以跟踪已经处理的内容和未处理的内容?还是我必须自己管理?

标签: c#autofac

解决方案


我会尝试回答您的问题,但其中有一个“依赖”,只是为了警告您。

  1. 所有生命周期范围都完全支持异步处理。如果您使用的是 ASP.NET Core 集成,则每次请求的生命周期范围将始终使用该DisposeAsync方法自动处理。但是,如果您以其他方式创建生命周期范围,则需要使用async using自己使其异步处理。

  2. 这取决于您如何消耗需要清理的资源。

    如果你的组件依赖于 Autofac 注入的服务,并且这些服务不是 ExternallyOwned,那么不要自己处理它们,让 Autofac 为你处理。如果作用域被异步处理, Autofac 知道在组件上调用同步Dispose,但组件没有实现IAsyncDisposable.

    如果您要注入ExternallyOwned组件,或在组件内分配 Autofac 不知道的资源,您将需要自己处理这些资源,无论是使用Dispose还是DisposeAsync根据需要,以正常方式。


推荐阅读