Объект шаблона репозитория, внедренный в зависимость, удаляется после вызова asyn

#c# #dependency-injection #async-await #asp.net-web-api2 #autofac

#c# #внедрение зависимостей #async-await #asp.net-web-api2 #autofac

Вопрос:

Я выполняю вызов PostAsync на бизнес-уровне моего приложения WebAPI.

Используя AutoFac, я настраиваю свои привязки следующим образом:

 builder.RegisterGeneric(typeof(SqlServerRepository<>))
       .As(typeof(IRepository<>))
       .InstancePerLifetimeScope();
builder.RegisterType<WspSQLDbContext>()
       .As<DbContext>()
       .InstancePerLifetimeScope();
  

Репозиторий вводится в контроллер:

 public KenSciConnector(log4net.ILog logger, IRepository<KenSciBatch> kensciBatchRepository) {
    _logger = logger;
    _kensciBatchRepository = kensciBatchRepository;
}
  

Функция, которая вызывает асинхронную функцию, выглядит следующим образом:

 public Response SendToVendor(Observation observation) {
    Response batchingResponse;
    // some logic
    var sendResponse = SendToKensci(requestObject, batch);           
    return batchingResponse;
}
  

… и функция, которая фактически выполняет асинхронный вызов, выглядит следующим образом:

 private async Task<Response> SendToKensci(KenSciRequest requestObject, KenSciBatch kenSciBatch) {
    var response = new Response();

    try {
        var httpClient = new HttpClient();

        await httpClient
            .PostAsync(httpClient.BaseAddress, new StringContent(seralizedObject, Encoding.UTF8, "application/json"))
            .ContinueWith((requestTask) => UpdateBatch(requestTask, kenSciBatch));
        } catch (Exception e) {
            // some logic
            return response;
        }

        // some logic
        return response;
    }
  

В функции обратного вызова, когда я пытаюсь обновить, я получаю исключение, которое DbContext уже удалено.

 private void UpdateBatch(Task<HttpResponseMessage> requestTask, KenSciBatch kenSciBatch) {
    try {
        if (requestTask.Result.StatusCode == HttpStatusCode.OK) {
            kenSciBatch.Status = BatchStatus.Sent;
            _kensciBatchRepository.Update(kenSciBatch);
        }
    } catch (Exception ex) {
        throw ex;
    }
}
  

Комментарии:

1. да, это была проблема. put — это ответ.

Ответ №1:

Здесь:

 var sendResponse = SendToKensci(requestObject, batch); 
  

вы не ожидаете SendToKensci (который возвращает Task ), и поэтому иногда в середине его выполнения — контекст удаляется (потому что вы SendToVendor уже покинули функцию)