Могу ли я использовать фабрику AutFa c для создания моего DbContext - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь реализовать автоматическое обновление sh с использованием MemoryCache, указав делегат CacheEntryUpdateCallback, который вызывается по истечении срока действия кэшированного элемента. Делегат вызывает метод в моем репозитории:

public async Task<List<Foo>> GetFoos()
{
   return await _dbContext.Foos.ToListAsync();
}

Это вызывает исключение в обратном вызове, поскольку контекст уже удален (оригинальный HttpRequest давно вернулся)

Поэтому я попытался используя фабрику Autofa c, чтобы вместо этого внедрить мою зависимость:

public FooRepository(Func<<IFooContext> dbContextFactory)
{
    _dbContextFactory = dbContextFactory;
}

public async Task<List<Foo>> GetFoos()
{
   return await _dbContextFactory().Foos.ToListAsync();
}

Это дало мне другое исключение:

Экземпляры не могут быть разрешены, и из этого не могут быть созданы вложенные времена жизни LifetimeScope, как он уже был утилизирован.

А как насчет этой "Собственной" фабрики?

public FooRepository(Func<Owned<IFooContext>> dbContextFactory)
{
    _dbContextFactory = dbContextFactory;
}

public async Task<List<Foo>> GetFoos()
{
   using(var factory = _dbContextFactory())
   {
       return await factory.Value.Foos.ToListAsync();
   }
}

Нет, та же проблема:

Экземпляры не могут быть решены, и вложенные времена жизни не могут быть созданы из этого LifetimeScope, поскольку он уже был удален.

Что я могу сделать, чтобы обойти эту проблему?

1 Ответ

0 голосов
/ 03 мая 2020

у вас должна быть размещенная служба для долгосрочного процесса и вида refre sh очередь для ее подачи

с размещенной службой вы можете получить DbContext во временной области следующим образом

public class TimedHostedService : IHostedService
{
    private readonly IServiceScopeFactory scopeFactory;

    public TimedHostedService(IServiceScopeFactory scopeFactory)
    {
        this.scopeFactory = scopeFactory;
    }

    private void DoWork()
    {
        using (var scope = scopeFactory.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();
        }
    }
}

о хостинг

...