将DBContext服务添加到Worker项目中的program.cs中

2024-04-14

对于这一切还相当陌生,所以如果我做了任何愚蠢的事情,我深表歉意。

我正在尝试实现一个与我设置的本地 SQL Server Express 数据库进行通信的工作项目。

我将连接字符串存储在我的AppSettings.Json如下所示

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "ConnectionStrings": {
    "DBConnection": "Server=localhost\\SQLEXPRESS;Database=TwitterTesting;Trusted_Connection=True;"
  }
}

然后我有一个DBContext.cs存储我的数据库结构的文件。目前我只有一张表“推文”。

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkerService1.Entities;

namespace WorkerService1
{
    public class DataContext : DbContext
    {
        public DataContext(DbContextOptions options) : base(options)
        {
        }

        public DbSet<tweets> tweets { get; set; }
    }
}

Tweets.cs仅具有列结构。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace WorkerService1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddDbContextPool<DataContext>(
                        options => options.UseSqlServer(hostContext.Configuration.GetConnectionString("DBConnection"))
                    );
                    services.AddHostedService<Worker>();
                });
    }
}

上面是我的program.cs我试图在其中添加实现的文件DBContext,但我在编译时收到以下错误:

System.AggregateException:“无法构造某些服务(验证服务描述符时出错”ServiceType:Microsoft.Extensions.Hosting.IHostedService Lifetime:Singleton ImplementType:WorkerService1.Worker”:无法使用范围服务“WorkerService1.DataContext”单例“Microsoft.Extensions.Hosting.IHostedService”。)

我从网上看的理解是这与依赖注入有关,但我真的很困惑我需要做什么。

任何帮助将不胜感激! :)


问题是你正在尝试创建一个Scoped您的 DbContext 的服务,但是将使用它的类(Worker) is a Singleton类 - 请注意以下两行。

services.AddDbContextPool<DataContext>( /*omitted*/ );
services.AddHostedService<Worker>();

虽然这些都没有明确说明how该服务正在添加到 DI,AddHostedService<Worker>正在注册Worker类作为单例 - 只有一个实例Worker将被创造,永远。AddDbContextPool<DataContext>正在注册DataContext作为范围服务 - 每次创建范围时都应该构建一个服务,其中DataContext被要求。

问题是如果Worker要求DataContext在构造函数中,你会得到一个DataContext将在该持续时间内生存Worker- 这将是永远的,因为Worker是一个单例。

获得范围DataContext在你的Worker类,您需要从 DI 获取服务提供者,并在每次调用时创建一个范围Worker在主方法中迭代 - 例如:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Management.Infrastructure;
using Microsoft.Management.Infrastructure.Options;
using System;
using System.Threading;
using System.Threading.Tasks;
private readonly ILogger<Worker> _logger;
private readonly IServiceProvider _serviceProvider;

public Worker (ILogger<Worker> logger, IServiceProvider serviceProvider)
{
    _logger = logger;
    _serviceProvider = serviceProvider;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCancellationRequested)
    {
        _logger.Log("Creating scope to get a new DataContext.");
        // this will give us a scoped service
        using var scope = _serviceProvider.CreateScope();
        var services = scope.ServiceProvider;
        // if DataContext were configured as singleton through AddSingleton<DataContext> 
        // in ConfigureServices, this would always be the same instance. Since it's added 
        // as Scoped, we'll get the same instance every time we ask for the service from 
        // our scope but each time we create a new scope it'll be a new instance.
        var context = services.GetService<DataContext>();
        // do something with context
        // we can validate that within our scope it's always the same object reference:
        _logger.Log("Get scoped service multiple times yields the same reference: {0}", object.ReferenceEquals(context, services.GetService<DataContext>());
        context.Dispose();
    }
}

有关更多信息,请查看以下页面 - 特别注意提及“Scoped”、“Transient”和“Singleton”。https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将DBContext服务添加到Worker项目中的program.cs中 的相关文章

随机推荐

  • 在 Java 中删除数组中重复项的最佳方法是什么?

    我有一个对象数组 需要删除 过滤重复项 我打算只重写 Object 元素上的 equals 和 hach Code 然后将它们放在 Set 中 但我想我至少应该轮询 stackoverflow 以查看是否有另一种方法 也许是其他 API 的
  • 使用新的 registerForActivityResult 请求在 DialogFragment 中写入的权限

    我尝试提醒用户在退出活动时将数据保存在文件中 因此 我显示一个对话框 询问他们是否要存储数据 这里我需要检查是否授予了权限 如果没有 请请求它 一旦被授予 就写入文件 我无法在 DialogFragment 中捕获 onRequestPer
  • 在 Linux 上使用 Apache Commons Compression 压缩文件时出现编码错误

    我正在使用 Apache Commons API Compression 来压缩文件 Windows 7 工作正常 但在 Linux ubuntu 10 10 UTF8 中 文件名和文件夹名称中的字符 例如 会被 替换 压缩时或解压缩 ta
  • 在 Rust 中将单个值分配给一行中的多个变量?

    分配多个变量的常见方法通常用 C 或 Python 等编程语言表示为 a b c value Rust 中是否有与此等效的内容 或者您 需要将其写出来 a value b value c value 如果这是显而易见的 我很抱歉 但我所有的
  • PostgreSQL 按 24 小时时段中午到中午进行分组

    正如标题所示 使用 PostgreSQL 我需要能够在 24 小时内 从中午到中午 聚合数据 在几周的时间内每 5 分钟收集一次数据 我希望对从第一天中午 12 00 到第二天中午 12 00 的 24 小时内的读数进行平均 直到数据结束
  • 尝试在 Genymotion 上使用 libgdx 运行 Android 游戏

    有人对 libgdx 和 genymotion 有经验吗 我正在尝试让 libgdx 游戏在 genymotion Android 模拟器上运行 http www genymotion com http www genymotion com
  • R 错误,显示“模型并非全部适合相同大小的数据集”

    我创建了两个广义线性模型 如下所示 glm1 lt glm Y X1 X2 X3 family binomial link logit glm2 lt glm Y X1 X2 family binomial link logit 然后我使用
  • 如何计算贝塞尔曲线上的控制点?

    我确实有一条贝塞尔曲线 在某个点上 我想要第二条贝塞尔曲线以平滑的方式 分支 第一条曲线 除了计算交点 贝塞尔曲线后面的百分比 之外 我还需要控制点 切线和权重 交点是通过以下 javascript 计算的 getBezier functi
  • 使用 .NET 填充 html 列表控件

    我有一个如下定义的列表 ul class myClass li class myItemClass Item 1 li li class myItemClass Item 2 li ul 使用 NET 如何动态地将项目添加到列表中 我还需要
  • Telegram Bot getUpdates VS setWebhook

    我想为企业开发一个机器人 我不知道使用获取更新 https core telegram org bots api getupdates开发 Windows 桌面应用程序并在 vps 上运行该应用程序的方法 通过https github co
  • 使用 React 动态更改输入文本时如何启用 Ctrl + Z?

    我正在尝试创建一个简单的React Markdown 编辑器 https github com andrerpena react mde 该组件是完全受控的 问题是 如果用户选择abc在文本区域中并单击B按钮 我需要打电话onchange
  • 将函数指针转换为另一种类型

    假设我有一个函数接受void void 用作回调的函数指针 void do stuff void callback fp void void callback arg 现在 如果我有一个这样的函数 void my callback func
  • Flyway可以从数据模型中找到并生成迁移文件吗?

    大家好 我一直在看 Flyway 但我不确定如何使用它 就我而言 我有一个实体模型 使用 JPA 注释 对我来说 有用的是 FlyWay 可以在我每次调用 迁移 并生成迁移文件时找出模型上的更改 这就是 Rails 等的工作方式 Rails
  • 解释一下Smalltalk的一段代码?

    我无法理解这段 Smalltalk 代码 line self upTo Character cr size 0 whileTrue 有人可以帮忙解释一下吗 如果您有代码来源的映像 可以做的一件简单的事情就是在其上运行调试器并单步执行 如果您
  • iOS 模拟器无法访问任何 URL 并显示错误“此连接不是私有的”

    我遇到了一个问题 我的 iPhone 模拟器无法访问 SAFARI 上的任何网站 我也无法从我的应用程序调用任何 API SAFARI 显示的错误是下面提到的两个错误之一 此连接不是私有的 Refer Screenshot OR Safar
  • 如何优化多图像拼接?

    我正在 Visual Studio 2012 C 中进行多图像拼接 我已经修改了缝合 详细 cpp https github com opencv opencv blob master samples cpp stitching detai
  • 查询返回准确的行数

    我有一个表存储两个外键 实现 n m 关系 其中一个指向一个人 subject 另一个针对特定项目 现在 一个人可能拥有的物品数量在另一个表中指定 我需要一个查询 该查询将返回与一个人可能拥有的物品数量相同的行数 其余记录可以填写NULL价
  • ElectronJS - 在窗口之间共享 redux 存储?

    我有一个基于的电子应用程序electron react boilerplate 现在 我有一个窗口按照我希望的方式运行 我开始创建一个新窗口 我目前有 2 个 html 文件 每个窗口一个 包含 div 根 div div div div
  • 父控件的 WPF ContextMenu 在具有自己的 ContextMenu 的子控件上打开

    我在基于 Canvas 的 WPF 中制作了一个相当不错的 NodeGraph 现在我正在通过右键单击菜单添加一些漂亮的功能 这些菜单是上下文相关的 这意味着右键单击图形的背景将显示图形 ContextMenu 而右键单击图形中的节点将显示
  • 将DBContext服务添加到Worker项目中的program.cs中

    对于这一切还相当陌生 所以如果我做了任何愚蠢的事情 我深表歉意 我正在尝试实现一个与我设置的本地 SQL Server Express 数据库进行通信的工作项目 我将连接字符串存储在我的AppSettings Json如下所示 Loggin