常规生命周期范围内的 Autofac IAsyncDisposable 支持

Autofac IAsyncDisposable support during regular lifetime scopes

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

假设我们有一个组件通过

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

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

While you do not have to implement IDisposable if you implement IAsyncDisposable, we strongly recommend you do so. If your component only implements IAsyncDisposable, but someone disposes of the scope synchronously, then Autofac will throw an exception, because it does not know how to dispose of your component.

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

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

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

我会尽量回答你的问题,但里面有一个'depends',只是为了警告你。

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

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

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

    如果您正在注入 ExternallyOwned 组件,或者在您的组件内部分配 Autofac 不知道的资源,您将需要使用 DisposeDisposeAsync 根据需要,以正常方式。