Второй вызов посредника завершается с ошибкой ObjectDisposeException в ASP.NET Core с использованием Autofac: «ЭкземплярC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Второй вызов посредника завершается с ошибкой ObjectDisposeException в ASP.NET Core с использованием Autofac: «Экземпляр

Сообщение Anonymous »

Я пытаюсь запустить два вызова посредника внутри метода. По какой-то причине второй вызов посредника всегда завершается неудачно. Я ожидаю, что оба вызова будут выполнены без ошибок. Полное сообщение об ошибке:

System.ObjectDisposeException: экземпляры не могут быть разрешены, и
вложенные сроки жизни не могут быть созданы из этого LifetimeScope, поскольку он (илиодна из родительских областей) уже удалена

Упрощенная версия моего кода:

Код: Выделить всё

// MainLogic.cs (registered as Transient)

private readonly IDateTimeProvider _dateTimeProvider; // Registered as Singleton
private readonly IMediator _mediator; // Registered with Autofac, which defaults to transient

public MainLogic(IDateTimeProvider dateTimeProvider, IMediator mediator)
{
_dateTimeProvider = dateTimeProvider;
_mediator = mediator;
}

public async Task[*]> MainProcessingLogic(string key, List listOfItems, DateTime dateTime)
{
try
{
var myVar = (await _mediator.Send(new ProcessSomeQuery(key, listOfItems, dateTime))).FirstOrDefault();
}
catch (Exception ex)
{
_logger.LogError("ProcessSomeQuery ran into an error : " + ex);
}

try
{
var myVar = await _mediator.Send(new ProcessSomeOtherDifferentQuery(key, listOfItems, dateTime));
}
catch (Exception ex)
{
_logger.LogError("ProcessSomeOtherDifferentQuery ran into an error : " + ex);
}
...some other code
}
Первая зависимость запроса (ProcessSomeQuery) внедряет IMyDataBaseContext. Обратите внимание, что это НЕ структура сущностей. Он зарегистрирован в Autofac, который по умолчанию использует экземпляр для каждой зависимости (переходный). Он просто извлекает некоторые данные.

Код: Выделить всё

private readonly IMyDataBaseContext _myDatabaseContext;
private readonly ILogger
 _logger;

public ProcessSomeQueryHandler(IMyDataBaseContext myDatabaseContext, ILogger logger)
{
_myDatabaseContext = myDataBaseContext;
_logger = logger;
}
Второй запрос (ProcessSomeOtherDifferentQuery) внедряет только регистратор и ничего больше. Дескриптор также не делает ничего, кроме регистрации сообщения.

Код: Выделить всё

private readonly ILogger
 _logger;

public ProcessSomeOtherDifferentQueryHandler(ILogger logger)
{
_logger = logger;
}
Некоторые странные действия
  • Только второй вызов посредника приводит к ошибка. Если я поменяю порядок ProcessSomeQuery и ProcessSomeOtherDifferentQuery, так что ProcessSomeOtherDifferentQuery теперь будет первым вызовом посредника, а ProcessSomeQuery станет вторым вызовом посредника, тогда ProcessSomeQuery сейчас произойдет сбой.
  • Если я заменю ProcessSomeOtherDifferentQuery на ProcessSomeQuery так, что у меня будет два вызова посредника для ProcessSomeQuery< /code>, при втором вызове все равно выдаст ту же ошибку.
  • Обратите внимание, что только зависимость ProcessSomeQuery вводит контекст базы данных. ProcessSomeOtherDifferentQuery только внедряет регистратор. Это приводит к ошибке. Если обе зависимости внедряют контекст базы данных, все равно только второй вызов посредника завершается неудачей.
  • Я пробовал менять области действия во всех видах конфигураций, к сожалению, не повезло.
  • Если я удалю внедрение контекста базы данных из ProcessSomeQuery, это не приведет к ошибке.
Все мои регистрации (на самом деле они в разных файлах)

Код: Выделить всё

services.AddTransient();
services.AddSingleton();
IMediator is registered with Autofac which defaults to Transient, I believe
MyDataBaseContext is registered with autofac which defaults to Transient
Как обеспечить успешное выполнение обоих вызовов посредника, не сталкиваясь с исключением ObjectDisposeException?

Подробнее здесь: https://stackoverflow.com/questions/787 ... e-using-au
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»