无法使用单例“ WorkshopPlanning.Jobs.Scheduling.IScheduledTask”中的范围服务“ WorkshopPlanning.Data.ICalendarStatusData”

时间:2019-05-23 13:16:33

标签: c# dependency-injection .net-core

我知道之前曾在这里提出过这个问题,但是我似乎无法使其运行。

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());

我不知道怎么了。这是我从另一个开发人员“继承”的应用程序。他不知道出什么问题了,因为他之前说过很好。

2 个答案:

答案 0 :(得分:0)

这是一个数据库问题。

当我连接到暂存数据库时,它工作正常。

答案 1 :(得分:0)

答案很简单。例外是描述性的。您正在将“ WorkshopPlanning.Data.ICalendarStatusData”注册为“范围”,并将“ WorkshopPlanning.Jobs.Scheduling.IScheduledTask”注册为Singleton。

由于Singleton和Scoped之间的根本差异,您不能/ 不应该在Singleton中使用“ WorkshopPlanning.Data.ICalendarStatusData”。