Невозможно использовать ограниченную службу WorkshopPlanning.Data.ICalendarStatusData из одноэлементного WorkshopPlanning.Jobs.Scheduling.IScheduledTask. - PullRequest
0 голосов
/ 23 мая 2019

Я знаю, что вопрос уже задавался здесь раньше, но, похоже, я не могу его запустить.

В моем файле 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.Data.ICalendarStatusData» из одноэлементного «WorkshopPlanning.Jobs.Scheduling.IScheduledTask»

Я получаю исключение при следующем вызове:

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 голосов
/ 23 мая 2019

Ответ прост. Исключение довольно наглядно. Вы регистрируете «WorkshopPlanning.Data.ICalendarStatusData» как «Scoped» и «WorkshopPlanning.Jobs.Scheduling.IScheduledTask» как синглтон.

Вы не можете / не должны потреблять WorkshopPlanning.Data.ICalendarStatusData 'в пределах Singleton из-за фундаментальных различий между Singleton и Scoped.

0 голосов
/ 23 мая 2019

Это была проблема с базой данных.

Когда я подключился к нашей промежуточной базе данных, она работает нормально.

...