Автофа c, нить и ISErviceScopeFactory - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблема: поставщик услуг удаляется, когда прибывает в метод. Это проблема или это моя вина?

Мой сервис

public class BomService
{
  private readonly IServiceScopeFactory _scope;

  public BomService(IServiceScopeFactory scope)
  {
      _scope = scope;
  }

  public void ImportAsync(ImportRequestDto importSettings)
  {
       Task.Run(async () => await ImportFile.ImportAsync<Bom, CatalogContext>(_scope));
  }
}

Метод

public static async Task ImportAsync<T, TContext>(IServiceScopeFactory parentScope) where T : class where TContext : DbContext
{
     using var scope = parentScope.CreateScope();
     var repo = scope.ServiceProvider.GetService<IGenericRepository<T, TContext>>();
}

Ошибка:

Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed

1 Ответ

0 голосов
/ 13 февраля 2020

Не выполняйте долго выполняющиеся задачи в HTTP-запросе, это должно быть выполнено в отдельном процессе при немедленном возврате ответа клиенту.

См. Ответ на этот вопрос

Как также предлагалось, вы можете использовать что-то вроде Hangfire для запуска фоновых процессов.

Обновление Не рекомендуется вводить IServiceScopeFactory. Например, вы внедряете анти-шаблон Service Locator. Вместо этого вставьте хранилище напрямую и позвольте DI определить разрешение и область действия.

...