【问题标题】:How do I access an EF db context in a BackgroundService class in a Web API?如何在 Web API 的 BackgroundService 类中访问 EF db 上下文?
【发布时间】: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


【解决方案1】:

在 WorkerService 中创建那个集合类怎么样?

喜欢,var collection = ReportCollection&gt;()

您可以将其放入构造函数并创建实例,而不是使用 DI。

【讨论】:

  • 您好,这个集合类在其他地方也用到了,所以不能直接移到WorkerService中。另外,我仍然需要将 DbContext 传递给集合类的构造函数。这是更大的问题。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多