【问题标题】:Can I use an AutFac factory to create my DbContext我可以使用 AutFac 工厂来创建我的 DbContext
【发布时间】:2020-05-03 12:46:30
【问题描述】:

我正在尝试通过指定缓存项过期时调用的 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】:

    您应该为长期运行过程和刷新队列提供托管服务

    使用托管服务,您可以在临时范围内获取 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

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多