我可以使用AutFac工厂创建我的DbContext

问题描述 投票:0回答:1

我正在尝试通过指定一个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中移除,因为它已经被废弃。

我该如何解决这个问题?

c# asp.net dependency-injection autofac
1个回答
0
投票

您应该为长期运行的过程提供托管服务,并且需要某种刷新队列来提供该服务

使用托管服务,您可以按照以下方式在临时范围内获得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>();
        }
    }
}

关于hosted service

© www.soinside.com 2019 - 2024. All rights reserved.