Ошибка активации int Нет соответствующих привязок

Я пытаюсь использовать Hangfire для выполнения фоновой работы в моем проекте MVC.

Я звоню Enqueue Метод в конструкторе моего контроллера:

public SHQSController(IUnitOfWork uow) : base(uow)
{
    BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge());
}

_Uow.CostRepository свойство возвращает интерфейс:

public ICostRepository CostRepository
{
    get
    {
       return new CostRepository(_Context, _CurrentOrganisationID);
    }
}

Но в Hangfire работа не выполняется, что объясняется следующей причиной:

Ошибка активации int Нет подходящих привязок…

Я обнаружил, что если я изменю код так, что работа будет вызвана реализацией ICostRepository вместо интерфейса работает:

т.е. в моем контроллере:

BackgroundJob.Enqueue(() => _Uow.Test());

и в моей единице работы:

public void Test()
{
    new CostRepository(_Context, _CurrentOrganisationID).Merge();
}

Что здесь происходит? Есть ли способ поставить в очередь работу, которая позволяет мне поместить мою реализацию в мой репозиторий, а не в единицу работы?

РЕДАКТИРОВАТЬ: Я нашел полное сообщение об ошибке в таблице HangFire.State Полная ошибка:

Ошибка активации int Нет соответствующих привязок, и тип не является самосвязываемым. Путь активации: 2) Инъекция зависимости int в параметр currentOrganisationID конструктора типа CostRepository 1) Запрос предложений CostRepository: 1) Убедитесь, что вы определили привязку для int. 2) Если привязка была определена в модуле, убедитесь, что модуль был загружен в ядро. 3) Убедитесь, что вы случайно не создали более одного ядра. 4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра конструкторов. 5) Если вы используете автоматическую загрузку модуля, убедитесь в правильности пути поиска и фильтров.

Так что проблема заключается в CurrentOrganisationID что CostRepository зависит от. CurrentOrganisationID в настоящее время извлекается из HttpContext и установить единицу работы, которая передает ее конструктору хранилища, как показано в моем коде выше.

1 ответ

Решение

Я думаю, что проблема с этой строкой:

BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge());

является то, что Hangfire интерпретирует это как требование для реализации реализации ICostRepository и запустить его Merge метод, а не создавать экземпляр реализации IUow и беги CostRepository.Merge() на что.

Я обошел это, создав открытый метод на контроллере:

public void Merge(int organisationid)
{
    _Uow.CostRepository.MergeSHQSCostsTable(organisationid);
}

и передать это Enqueue метод:

BackgroundJob.Enqueue(() => Merge(organisationid));

Работа в очереди от Hangfire теперь SHQSController.Merge и зависимости теперь правильно разрешены.

Кроме того, вы можете заметить, что теперь я прохожу organisationid в метод в качестве параметра, где ранее он был доступен в хранилище. Это извлечено из HttpContext и поскольку он недоступен, когда создается экземпляр контроллера из фонового задания, мне пришлось создать еще один закрытый метод, вызываемый из конструктора, чтобы organisationid был подключен к фоновой работе:

Итак, вместо:

public SHQSController(IUnitOfWork uow) : base(uow)
{
    BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge(CurrentOrganisationId));
}

Я имею:

public SHQSController(IUnitOfWork uow) : base(uow)
{
   EnqueueMerge(CurrentOrganisationID);
}

private void EnqueueMerge(int organisationid)
{
    BackgroundJob.Enqueue(() => Merge(organisationid));
}
Другие вопросы по тегам