使用Hangfire for ASP.NET Core的触发控制器方法

时间:2019-03-25 11:41:25

标签: c# asp.net-core asp.net-core-2.0 hangfire

伙计们,

我正在尝试在ASP.NET Core的Controller内部触发某个命令。

我已经安装了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 :(得分:0)

更新
由于Rotavita与控制器,视图等紧密结合。我建议分两步解决此问题

  1. 使用RazorEngine从视图生成HTML(出于报告/电子邮件目的,将该视图与普通视图分开),您只需要视图/模板路径和模型(包含要呈现的值)< / li>
  2. 使用wkhtmltopdf使用HTML生成PDF(Rotavita在后​​台使用此lib)


原始

由于调用controller实例是框架完成的过程,因此cron作业不应调用或调用它。
对于您的问题,您只需要将引用添加到方法或委托即可。假设您要将代码移至其他类。

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

Foo

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