C# 依赖注入的DbContext始终为空
我已经在多个ASP.NET(核心)应用程序中使用了DI,其中DbContext被注入控制器构造函数,并且在第一次请求控制器时,构造函数被运行,依赖项被注入 我现在正在处理一个连接到Azure消息总线的web API项目,处理和持久化来自总线的数据,并为数据提供API端点。处理和持久化来自Azure消息总线的消息的类是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
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);
}
我正在寻找一种更干净的方式来实现:
- 调用
中的方法来处理项目开始时的Azure消息总线消息QueueProcessor
- 在处理消息之前,我应该有一个
的实例化实例,可以在处理消息时使用它来持久化消息MyDbContext
- 无需使用
控制器来正确设置DI
有没有办法做到这一点,或者我完全没有抓住要点?一个有效的解决方案,不确定它是否是最佳模式:
Startup.cs
chanceConfigureServices
中返回IServiceProvider
而不是void
var serviceProvider=services.BuildServiceProvider()代码>
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;
}