C# 依赖注入的DbContext始终为空

C# 依赖注入的DbContext始终为空,c#,entity-framework,azure,dependency-injection,async-await,C#,Entity Framework,Azure,Dependency Injection,Async Await,我已经在多个ASP.NET(核心)应用程序中使用了DI,其中DbContext被注入控制器构造函数,并且在第一次请求控制器时,构造函数被运行,依赖项被注入 我现在正在处理一个连接到Azure消息总线的web API项目,处理和持久化来自总线的数据,并为数据提供API端点。处理和持久化来自Azure消息总线的消息的类是QueueProcessor 我需要从projectstart持久化数据,这意味着我需要一个DbContext实例,从项目运行时开始,而不是从API端点查询数据时开始。因此,Queu

我已经在多个ASP.NET(核心)应用程序中使用了DI,其中DbContext被注入控制器构造函数,并且在第一次请求控制器时,构造函数被运行,依赖项被注入

我现在正在处理一个连接到Azure消息总线的web API项目,处理和持久化来自总线的数据,并为数据提供API端点。处理和持久化来自Azure消息总线的消息的类是
QueueProcessor

我需要从projectstart持久化数据,这意味着我需要一个DbContext实例,从项目运行时开始,而不是从API端点查询数据时开始。因此,
QueueProcessor
的构造函数永远不会被隐式调用,如果我想手动调用,我需要一个预先存在的
MyDbContext
实例来传递给它

我已经对此进行了几天的研究,尝试了一些手动模式,但我遇到了并发性问题,整个项目目前感觉像是一个黑客

这就是我目前正在做的:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));

        services.AddDbContextPool<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("default")));

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
我正在寻找一种更干净的方式来实现:

  • 调用
    QueueProcessor
    中的方法来处理项目开始时的Azure消息总线消息
  • 在处理消息之前,我应该有一个
    MyDbContext
    的实例化实例,可以在处理消息时使用它来持久化消息
  • 无需使用
    控制器来正确设置DI

有没有办法做到这一点,或者我完全没有抓住要点?

一个有效的解决方案,不确定它是否是最佳模式:

  • Startup.cs
    chance
    ConfigureServices
    中返回
    IServiceProvider
    而不是
    void
  • 使用以下命令生成serviceProvider:
    var serviceProvider=services.BuildServiceProvider()
  • 获取MyDbContext的实例:
    var context=serviceProvider.GetRequiredService()
  • 创建
    QueueProcessor
    的实例,并将
    context
    传递给构造函数,然后调用方法开始处理消息
  • ConfigureServices
    ,返回新的
    serviceProvider
  • 完整代码块:

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("...")));
    
            var serviceProvider = services.BuildServiceProvider();
    
            var localMyDbContext = serviceProvider.GetRequiredService<MyDbContext>();
    
            Processor = new QueueProcessor(localDbContext, Configuration.GetConnectionString("Other"));
            Processor.RunAsync().GetAwaiter().GetResult();
    
            return serviceProvider;
        }
    
    公共IServiceProvider配置服务(IServiceCollection服务)
    {
    services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“…”));
    var serviceProvider=services.BuildServiceProvider();
    var localMyDbContext=serviceProvider.GetRequiredService();
    Processor=new QueueProcessor(localDbContext,Configuration.GetConnectionString(“其他”));
    Processor.RunAsync().GetAwaiter().GetResult();
    返回服务提供商;
    }
    
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("...")));
    
            var serviceProvider = services.BuildServiceProvider();
    
            var localMyDbContext = serviceProvider.GetRequiredService<MyDbContext>();
    
            Processor = new QueueProcessor(localDbContext, Configuration.GetConnectionString("Other"));
            Processor.RunAsync().GetAwaiter().GetResult();
    
            return serviceProvider;
        }