首页 > 解决方案 > System.ObjectDisposedException:此解析操作已结束

问题描述

我在 Autofac 中有以下配置:

builder.Register<ServiceFactory>(x => y => x.Resolve<IComponentContext>().Resolve(y));  

使用此配置,我收到错误:

System.ObjectDisposedException:此解析操作已结束。使用 lambda 注册组件时,无法存储 lambda 的 IComponentContext 'c' 参数。相反,要么从“c”再次解析 IComponentContext,要么解析基于 Func<> 的工厂以从中创建后续组件。

如果我使用以下内容,则可以使用:

builder.Register<ServiceFactory>(x => {
  IComponentContext context = x.Resolve<IComponentContext>();
  return y => context.Resolve(y);
});    

不能在一个代码行中进行此配置吗?

我错过了什么?

标签: c#autofac

解决方案


您的第一个配置看起来与第二个配置非常相似,但IComponentContext解决时间不同。

让我在不改变逻辑的情况下稍微重构你的第一个配置。

builder.Register<ServiceFactory>(x => 
{ 
    return y => x.Resolve<IComponentContext>().Resolve(y)
});  

在第一个示例中,您正在注册 lambda

  1. 返回 lambda,其中:

    1.1 解析IComponentContext

    1.2 在 IComponentContext 实例上调用 Resolve 并返回结果

让我们将其与第二种配置进行比较。

builder.Register<ServiceFactory>(x => {
  IComponentContext context = x.Resolve<IComponentContext>();
  return y => context.Resolve(y);
});    

在第二个示例中,您正在注册 lambda

  1. 解析 IComponentContext 并将其分配给变量 'context'

  2. 返回捕获变量上下文的 lambda 和:

    2.1 对变量上下文调用Resolve并返回结果

所以它在解析 IComponentContext 的时刻有所不同。


推荐阅读