我正在尝试通过指定一个CacheEntryUpdateCallback委托来使用MemoryCache来实现自动刷新,该委托在缓存项过期时被调用。委托人在我的存储库中调用一个方法:
public async Task<List<Foo>> GetFoos()
{
return await _dbContext.Foos.ToListAsync();
}
这会在回调中引发异常,因为上下文已经被处理(原始HttpRequest已经返回很久了)
所以我尝试使用Autofac工厂来注入我的依赖项:
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中移除,因为它已经被废弃。
我该如何解决这个问题?
您应该为长期运行的过程提供托管服务,并且需要某种刷新队列来提供该服务
使用托管服务,您可以按照以下方式在临时范围内获得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>();
}
}
}