【发布时间】:2020-11-15 01:00:44
【问题描述】:
我想知道 Autofac 如何处理具有常规生命周期的 IAsyncDisposable。
假设我们有一个通过以下方式注册的组件
builder.RegisterType<DnsResolutionService>()
.As<IDnsResolutionService>()
.SingleInstance();
在阅读文档时,我发现以下内容:
虽然如果您实施 IAsyncDisposable,则不必实施 IDisposable,但我们强烈建议您这样做。如果你的组件只实现了 IAsyncDisposable,但是有人同步释放了作用域,那么 Autofac 会抛出异常,因为它不知道如何释放你的组件。
我现在有点困惑,基本上我脑子里有两个问题:
-
添加到注册的常规生命周期范围是否完全支持异步处理?或者只有当我明确使用
using(var scope = container.BeginLifetimeScope())之类的东西时才会发生同步处理 - 由于只使用构造函数注入,我实际上基本上从不使用它。 -
如果某些东西实际上会尝试处置我的组件,该组件将同时实现
IDisposable和IAsyncDisposable,正如文档所建议的那样,以同步方式,那么它可能只会调用 IDisposable。在这种情况下,我是否也必须在同步处置块中处置我的所有 IAsyncDisposables? Autofac 是否提供任何类型的订单,例如IAsyncDisposable 首先被调用,所以我也许可以跟踪已经处理的内容和未处理的内容?还是我必须自己管理?
【问题讨论】:
-
似乎这是一个简单的单元测试,可以找到答案。你试过了吗?
-
如果它的单个实例 - 这真的重要吗?