worker .NET 8 项目中的 System.AggregateException

问题描述 投票:0回答:1

我正在尝试通过使用与 SQL Server 数据库通信的工作项目来实现 Windows 服务。

运行它时,我遇到两个异常:

System.AggregateException: 无法构造某些服务(验证服务描述符 ServiceType 时出错:Microsoft.Extensions.Hosting.IHostedService 生命周期:单例实现类型:TTRWindowWorkerService.TTRService.TTRReportService:无法使用作用域服务 TTRWindowWorkerService.TTRRepository。来自单例 Microsoft.Extensions.Hosting.IHostedService 的 ITTRReportRepository。

InvalidOperationException: 无法使用单例 Microsoft.Extensions.Hosting.IHostedService 中的作用域服务 TTRWindowWorkerService.TTRRepository.ITTRReportRepository。

这是我的

Program.cs
:

 var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json").Build();

 IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => {  
                    services.AddDbContext<SMPdbContext>(opt => { 
                        opt.UseSqlServer(configuration.GetConnectionString("ConnectionString"));
                      }); 
                       services.AddScoped<ITTRReportRepository,TTRReportRepository>();
                       services.AddHostedService<TTRReportService>();
                 })
         .UseWindowsService()
         .Build();

  await host.RunAsync();

我做错了什么?谁能给我解释一下吗?我没有找到任何解决方案。

我尝试使用Worker项目的后台服务来制作Windows服务。在那里,我从一个库项目中调用了

dbContext
,并尝试使用 LINQ 在非常短的时间内将数据插入到表中,但我的项目甚至还没有开始,就给了我异常。我尝试使用单例,但它现在也可以工作了。

我的服务构造函数:

public class TTRReportService : BackgroundService
{
      private readonly ITTRReportRepository ttrRepository;

      public TTRReportService(ITTRReportRepository _ttrRepository)
      {
          ttrRepository = _ttrRepository;
      }
}

存储库文件:

public  class TTRReportRepository(SWMdbContext _dbContext) :ITTRReportRepository
{
       public void UserStatusUpdate()
       {
           var count = _dbContext.Countries.Count();

           Country county = new Country
           {
               CountryName = $"test{count}",
               IsActive = true        
           };

           _dbContext.Countries.Add(county);

           _dbContext.SaveChangesAsync();
       }
}
database windows backgroundworker .net-8.0 aggregateexception
1个回答
0
投票

错误是说正确。

  1. 后台服务是单例的,因此无法访问作用域服务。

你必须做这样的事情。

public class TTRReportService : BackgroundService
{
      private readonly IServiceProvider serviceProvider;

      public TTRReportService(IServiceProvider serviceProvider)
      {
          this.serviceProvider = serviceProvider;
      }

      protected override async Task ExecuteAsync(CancellationToken stoppingToken) 
      {
               // Here you might be calling or using repository.
             using(var scope = serviceProvider.CreateScope())
             {
                var repository = scope.ServiceProvider
                    .GetRequiredService<ITTRReportRepository>();
                // Now use this repository. 
             }
      }
}
© www.soinside.com 2019 - 2024. All rights reserved.