Как я могу использовать некоторые из моих сервисов и репозиториев в классе заданий Quartz.net?

Мне нужно использовать некоторые из моих сервисов в классе заданий Quartz.net. Я использую Autofac в качестве внедрения зависимостей.

public class PushJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {                      
      // need to use some service here 

    }
}

person Ali Tanha    schedule 06.11.2018    source источник


Ответы (1)


Если вы ищете самое простое решение, просто сделайте свой класс PushJob отправной точкой = корень композиции вашего DI следующим образом:

public class PushJob : IJob
{
    private IContainer _container;

    public async Task Execute(IJobExecutionContext context)
    {                      
      Register();
      DoWork();
    }
}

в Register() просто создайте свой экземпляр контейнера, зарегистрируйте все зависимости и сохраните в _container. Затем в DoWork сделайте что-то вроде:

var worker = _container.Resolve<IWorker>();

это фактически создаст экземпляр вашего работника с вашим сервисом, введенным по мере необходимости.

person Bobo    schedule 06.11.2018
comment
это не работает, и ошибка была в этом. Область времени жизни запроса не может быть создана, поскольку HttpContext недоступен - person Ali Tanha; 06.11.2018
comment
HttpContext — это конструкция System.Web. Он используется в веб-приложениях, таких как ASP.NET. Напротив, Quartz вообще не подключен к ASP.NET, это похоже на запуск консольного приложения в указанное время. У вас нет HttpContext по умолчанию. - person Bobo; 06.11.2018
comment
autofaccn.readthedocs.io/en/latest/faq/per- request-scope.html может помочь вам уточнить. Если у вас есть контроль над своими регистрациями, я бы просто не выбрал время жизни каждого запроса в этом случае, поскольку у вас нет запроса для работы... Если вы можете зарегистрироваться в InstancePerLifetimeScope, все будет в порядке. - person Bobo; 06.11.2018