【发布时间】:2021-06-07 08:11:44
【问题描述】:
我有一个 Web API 端点,它在队列中插入项目(ReportQueue 类)。
我有一个类对每个队列项进行一些数据库处理(类ReportCollection)。
我有一个 BackgroundService 子类,它从队列中取出一个项目并将其传递给类(WorkerService 类)。
我可以在Startup.ConfigureServices 中注册这些课程,如下所示:
services.AddHostedService<WorkerService>().AddSingleton<IReportQueue<QueueItem>, ReportQueue<QueueItem>>();
services.AddScoped<IReportCollection, ReportCollection>();
但我在 db 上下文中处于两难境地 - 如何将其传递给 ReportCollection 类?
-
ReportCollection是 POCO,不符合 DI 资格。 - 我无法将它注入
WorkerService,因为我得到一个异常:
InvalidOperationException: Cannot consume scoped service 'DbContext'
from singleton Microsoft.Extensions.Hosting.IHostedService'.
- 试图从
WorkerService中获取对 db 上下文的引用不起作用 - 当var dbc...行未注释时,由于某种原因,整个代码块会被跳过:
using (var scope = scopeFactory.CreateScope())
{
var rc = scope.ServiceProvider.GetRequiredService<IReportCollection>();
//var dbc = scope.ServiceProvider.GetRequiredService<DbContext>();
rc.GetReport();
}
还有什么我可以尝试的吗?我正在使用.Net Core 3.1,顺便说一句。
【问题讨论】:
-
什么是 POCO?请解释一下
-
如果您在范围上请求数据库上下文,跳过该块意味着什么?如果您使用 .GetRequiredService 并且无法解析该服务,这会引发异常吗?是否有任何异常被捕获,如果是,异常是什么样的?
-
@HirasawaYui 普通的旧 CSharp 对象。
-
@Retrogott 没有抛出异常 - 但我在块中有一些日志语句没有被打印出来。
-
您是否尝试使用自定义 try catch 块来捕获异常?似乎在这种情况下并不总是记录异常。见Link
标签: c# asp.net-core asp.net-core-webapi background-service asp.net-core-hosted-services