【问题标题】:Autofac IAsyncDisposable support during regular lifetime scopes常规生命周期范围内的 Autofac IAsyncDisposable 支持
【发布时间】:2020-11-15 01:00:44
【问题描述】:

我想知道 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】:

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

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

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

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

    如果您要注入 ExternallyOwned 组件,或在组件内分配 Autofac 不知道的资源,您将需要自己处理这些资源,根据需要使用 DisposeDisposeAsync,在正常情况下方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多