我知道之前曾在这里提出过这个问题,但是我似乎无法使其运行。
startup.cs中包含以下内容:
services.AddDbContextPool<WorkshopPlanningDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("WorkshopPlanningDb"));
});
//Db data
services.AddScoped<IEmployeeData, SqlEmployeeData>();
services.AddScoped<IPlanningData, SqlPlanningData>();
services.AddScoped<ICalendarStatusData, SqlCalendarStatusData>();
services.AddScoped<IMachineTypeSpecs, SqlMachineTypeSpecs>();
services.AddScoped<IMoHistoryData, SqlMoHistoryData>();
//Cron Jobs
services.Configure<ProTimeConfig>(Configuration.GetSection("ProTimeSftp"));
services.AddSingleton<IScheduledTask, RetrieveProTimeData>();
services.AddSingleton<IScheduledTask, RemoveOldProTimeData>();
services.AddScheduler((sender, args) =>
{
args.SetObserved();
});
我的课程如下:
RetrieveProTimeData:
public class RetrieveProTimeData : IScheduledTask
{
private readonly ICalendarStatusData _calendarStatusData;
private readonly IOptions<ProTimeConfig> _proTimeConfig;
public string Schedule => "10 6-18 * * *";
public RetrieveProTimeData(ICalendarStatusData calendarStatusData, IOptions<ProTimeConfig> proTimeConfig)
{
this._calendarStatusData = calendarStatusData;
this._proTimeConfig = proTimeConfig;
}
}
运行代码时,出现异常:
无法使用单例“ WorkshopPlanning.Jobs.Scheduling.IScheduledTask”中的作用域服务“ WorkshopPlanning.Data.ICalendarStatusData”
在以下通话中我得到了异常:
return services.AddSingleton<IHostedService, SchedulerHostedService>(serviceProvider =>
{
var instance = new SchedulerHostedService(serviceProvider.GetServices<IScheduledTask>());
instance.UnobservedTaskException += unobservedTaskExceptionHandler;
return instance;
});
特别是在一行上:
var instance = new SchedulerHostedService(serviceProvider.GetServices());
我不知道怎么了。这是我从另一个开发人员“继承”的应用程序。他不知道出什么问题了,因为他之前说过很好。
答案 0 :(得分:0)
这是一个数据库问题。
当我连接到暂存数据库时,它工作正常。
答案 1 :(得分:0)
答案很简单。例外是描述性的。您正在将“ WorkshopPlanning.Data.ICalendarStatusData”注册为“范围”,并将“ WorkshopPlanning.Jobs.Scheduling.IScheduledTask”注册为Singleton。
由于Singleton和Scoped之间的根本差异,您不能/ 不应该在Singleton中使用“ WorkshopPlanning.Data.ICalendarStatusData”。