c# - 常规生命周期范围内的 Autofac IAsyncDisposable 支持
问题描述
我想知道 Autofac 如何处理具有常规生命周期的 IAsyncDisposable 。
假设我们有一个通过以下方式注册的组件
builder.RegisterType<DnsResolutionService>()
.As<IDnsResolutionService>()
.SingleInstance();
在阅读文档时,我发现以下内容:
如果您实施 IAsyncDisposable,则不必实施 IDisposable,但我们强烈建议您这样做。如果你的组件只实现了 IAsyncDisposable,但是有人同步地释放了作用域,那么 Autofac 会抛出一个异常,因为它不知道如何释放你的组件。
我现在有点困惑,基本上我脑子里有两个问题:
添加到注册的常规生命周期范围是否完全支持异步处理?或者只有当我明确使用类似的东西时才会发生同步处理
using(var scope = container.BeginLifetimeScope())
- 由于只使用构造函数注入,我实际上基本上从未使用过。如果某些东西实际上会尝试处置我的组件,该组件将同时实现
IDisposable
和IAsyncDisposable
,正如文档所建议的那样,以同步方式,那么它可能只会调用 IDisposable。在这种情况下,我是否也必须在同步处置块中处置所有 IAsyncDisposables?Autofac 是否提供任何类型的命令,例如首先调用 IAsyncDisposable,所以我也许可以跟踪已经处理的内容和未处理的内容?还是我必须自己管理?
解决方案
我会尝试回答您的问题,但其中有一个“依赖”,只是为了警告您。
所有生命周期范围都完全支持异步处理。如果您使用的是 ASP.NET Core 集成,则每次请求的生命周期范围将始终使用该
DisposeAsync
方法自动处理。但是,如果您以其他方式创建生命周期范围,则需要使用async using
自己使其异步处理。这取决于您如何消耗需要清理的资源。
如果你的组件依赖于 Autofac 注入的服务,并且这些服务不是 ExternallyOwned,那么不要自己处理它们,让 Autofac 为你处理。如果作用域被异步处理, Autofac 知道在组件上调用同步
Dispose
,但组件没有实现IAsyncDisposable
.如果您要注入
ExternallyOwned
组件,或在组件内分配 Autofac 不知道的资源,您将需要自己处理这些资源,无论是使用Dispose
还是DisposeAsync
根据需要,以正常方式。
推荐阅读
- reactjs - res.status(404)后如何将json数据从后端(express.js)发送到前端(react)?
- php - Laravel 集合中最新外键的唯一标识符
- r - 如何将一个数据帧的列中的值与R中另一个数据帧的标题匹配
- android - Media pipe Android App上的横向方向。一旦将应用程序设置为横向模式,相机方向就会出错
- java - 如何使用 AssertJ 检查对象的多个字段是否为空?
- node.js - SyntaxError: missing ) after argument list 似乎找不到可能的解决方案
- reactjs - 无法读取未定义的属性(读取“地图”) - useQuery
- mysql - 在 Power Bi 中加载比他们更多的行是
- google-sheets - ArrayFormula 什么都不做
- r - 闪亮的Updateselectinput出错,我得到相同的值