Ошибка активации 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));
}