Метод контроллера триггеров с использованием Hangfire для ASP.NET Core - PullRequest
0 голосов
/ 25 марта 2019

Добрый день, ребята,

Я пытаюсь вызвать определенную команду внутри моего Controller в ASP.NET Core.

Я установил Hangfire и настроил Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHangfire(x => x.UseSqlServerStorage('my conn string'));
    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    // add hangfire
    app.UseHangfireDashboard();
    app.UseHangfireServer();    
    ...
}

Но проблема в том, что в моем контроллере семплов есть несколько инъекций зависимостей

public class ProductsController: Controller
{
    private readonly ISomething1 something1;
    private readonly ISomething2 something2;
    private readonly ISomething3 something3;

    public ProductsController(ISomething1 something1, ISomething2 something2, ISomething3 something3){
        this.something1 = something1;
        this.something2 = something2;
        this.something3 = something3;
    }

    public async Task<IActionResult> TriggerMe(){
        ...
    }
}

Я пытаюсь реализовать что-то подобное при запуске

RecurringJob.AddOrUpdate(
() => // trigger the TriggerMe() controller method ,
Cron.Daily);

Любая помощь, пожалуйста? Спасибо

1 Ответ

0 голосов
/ 25 марта 2019

ОБНОВЛЕНИЕ
Поскольку Rotavita тесно связана с контроллерами, представлениями и т. Д., Я бы рекомендовал решить эту проблему в два этапа

  1. Создать HTML из представления (для создания отчетов / электронной почты отделяйте это представление от обычных), используя RazorEngine , вам потребуется только путь к представлению / шаблону и модель (содержащая значения, которые должны быть отображены)
  2. ИспользуйтеHTML для создания PDF с использованием wkhtmltopdf (Rotavita использует эту библиотеку под капотом)


Оригинал

Каквызов экземпляра controller - это процесс, выполняемый платформой, и он не должен вызываться или вызываться заданиями cron.
Для вашей проблемы вам просто нужно добавить ссылку на метод или делегат.Предполагая, что вы собираетесь переместить свой код в другой класс.

var instance=new Foo();
RecurringJob.AddOrUpdate(() => instance.DoSomething,Cron.Daily);

и Foo класс

public class Foo
{
    public void DoSomething()
    {
    //your code
    }
}
...