C# 当获取IHostedService的实现时,DBContext为null

C# 当获取IHostedService的实现时,DBContext为null,c#,asp.net-core,entity-framework-core,asp.net-core-webapi,C#,Asp.net Core,Entity Framework Core,Asp.net Core Webapi,我已经实现了IHostedService,在应用程序启动时,我将在其中加载缓存。在IHostedService的那个实现中,我需要DB的上下文,但当我试图获取它时,它是空的 我正在最后一行的StartUp ConfigureServices中加载我的服务: services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionStrin

我已经实现了IHostedService,在应用程序启动时,我将在其中加载缓存。在IHostedService的那个实现中,我需要DB的上下文,但当我试图获取它时,它是空的

我正在最后一行的StartUp ConfigureServices中加载我的服务:

   services.AddDbContext<MyContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DatabaseConnection")));

   ...

   services.AddHostedService<InitializeCacheService>();
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DatabaseConnection”));
...
services.AddHostedService();
我的服务如下所示(我得到的是缓存,而不是上下文):

公共类InitializeCacheService:iHosteService
{
专用读写器ViceScopeFactory\u scopeFactory;
公共初始化服务(IServiceScopeFactory范围工厂)
{
这。_scopeFactory=scopeFactory;
}
公共任务StartSync(CancellationToken CancellationToken)
{
使用(var scope=\u scopeFactory.CreateScope())
{
var cache=scope.ServiceProvider.GetService();
var context=scope.ServiceProvider.GetRequiredService();
CacheLogic CacheLogic=新的CacheLogic(缓存,上下文);
cacheLogic.LoadProfileCache();
}
返回Task.CompletedTask;
}
公共任务StopAsync(CancellationToken CancellationToken)
{
返回Task.CompletedTask;
}
}
我做错了什么? 提前非常感谢:-)

更新 这实际上是可行的,问题是我错过了CacheLogic中上下文的初始化:-很抱歉

但是现在它工作了,那么当我在CacheLogic中查询时,我得到了下面的错误,这可能是因为它是异步的,并且我在InitializeCacheService的时间限制范围内处理上下文

但是在重新思考我的解决方案之后,我认为CacheLogic应该是一个单例,然后我的问题是如何在单例中访问cache和DBContext(我将为此创建一个新问题)

System.ObjectDisposedException:'无法访问已处置的对象。此错误的一个常见原因是处理通过依赖项注入解析的上下文,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文调用Dispose(),或将上下文包装到using语句中,则可能会发生这种情况。如果您使用的是依赖项注入,那么应该让依赖项注入容器处理上下文实例。
ObjectDisposed\u ObjectName\u Name'

我从您显示的代码中看不到任何东西。看来一切正常。我建议您在Github或类似平台上共享整个解决方案。我看不到你分享的内容。非常感谢你的评论!但是,如果我没有弄错,那么上下文为空的原因是什么呢?我猜是启动中的某些设置不正确。或者可能数据库上下文不正确。但是只能猜测而看不到所有的代码。这个
InitializeCacheService
有什么用?仅用于测试?无论如何,您应该通过依赖项注入获得上下文,而不是将依赖项容器用作服务定位器。也就是说,
InitializeCacheService
constructor应该将这两个依赖项都作为构造函数参数。谢谢您的回复。InitializeCacheService用于在api启动时加载缓存,其中包含来自DB的数据。如果我尝试像在其他地方一样从构造函数获取上下文,则应用程序在启动时会引发异常:System.InvalidOperationException:“无法使用singleton”Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor“提供的作用域服务”DAL.MyContext“
public class InitializeCacheService : IHostedService
{
    private readonly IServiceScopeFactory _scopeFactory;
    public InitializeCacheService(IServiceScopeFactory scopeFactory)
    {
        this._scopeFactory = scopeFactory;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        using (var scope = _scopeFactory.CreateScope())
        {
            var cache = scope.ServiceProvider.GetService<IMemoryCache>();
            var context = scope.ServiceProvider.GetRequiredService<MyContext>();
            CacheLogic cacheLogic = new CacheLogic(cache, context);
            cacheLogic.LoadProfileCache();
        }

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}