System.ObjectDisposedException: эта операция разрешения уже завершена - PullRequest
0 голосов
/ 29 августа 2018

У меня есть следующая конфигурация в Autofac:

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

При такой конфигурации я получаю ошибку:

System.ObjectDisposedException: эта операция разрешения уже закончился. При регистрации компонентов с использованием лямбда-выражения параметр IComponentContext 'c' для лямбды не может быть сохранен. Вместо этого либо разрешите IComponentContext снова из 'c', либо разрешите фабрику на основе Func <> для создания последующих компонентов из.

Если я использую следующее, чем это работает:

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

Разве эта конфигурация не может быть выполнена в одной строке кода?

Что мне не хватает?

1 Ответ

0 голосов
/ 29 августа 2018

Ваша первая конфигурация очень похожа на вторую, но она отличается при разрешении IComponentContext.

Позвольте мне немного перестроить вашу первую конфигурацию без изменения логики.

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

В первом примере вы регистрируете лямбду, которая

  1. Возвращает лямбда, которая:

    1.1 Разрешить IComponentContext

    1.2 Вызовите разрешение для экземпляра IComponentContext и верните результат

Давайте сравним это со второй конфигурацией.

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

Во втором примере вы регистрируете лямбду, которая

  1. Разрешить IComponentContext и назначить его переменной 'context'

  2. Возвращает лямбду, которая захватывает контекст переменной, и:

    2.1 Вызовите Resolve в контексте переменной и верните результат

Так что он отличается на момент разрешения IComponentContext.

...