我正在尝试通过使用与 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();
}
}
错误是说正确。
你必须做这样的事情。
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.
}
}
}