我在class
方法是public
。当我把它添加到迟发型我得到了编译器错误
只有公有方法可以在后台调用。确保您的方法有
public
访问修饰符,并没有使用显式接口实现“。
public class JobsService
{
public void TestJob2(Parameters parameters)
{
}
}
public class JobsController : ControllerBase
{
private readonly JobsService _jobsService;
public JobsController(JobsService jobsService)
{
_jobsService = jobsService;
}
public IActionResult AddOrUpdate([FromQuery]string recurringJobId = "", [FromQuery]string methodName = "", [FromQuery] bool remove = false, [FromQuery] string cronExpression = "*/1 * * * *", [FromBody] Parameters parameters = null)
{
Expression<Action> expression = ToExpression(() => { string t = (string)method.Invoke(_jobsService, new object[] { parameters }); });
RecurringJob.AddOrUpdate(recurringJobId, expression, cronExpression);
}
}
拉姆达及其参数需要通过迟发型可序列化。据我所知,它的身体必须是一个简单的通话,例如没有方法分配。
该JobsService
实例执行工作不能成为一个由你的控制器引用。我假定你已经设置了迟发型依赖注入see "Using IoC containers",或JobsService
可以在不需要任何依赖see "Passing dependencies"被实例化。
你需要的方法添加到您的JobsService
类:
public void InvokeMethod(string methodName, Parameters parameters)
{
MethodInfo mi = typeof(JobsService).GetMethod(methodName);
string s = (string)mi.Invoke(this, new[] { parameters });
}
然后,你JobsController
AddOrUpdate
方法是:
public IActionResult AddOrUpdate([FromQuery]string recurringJobId = "",[FromQuery]string methodName = "", [FromQuery] bool remove = false, [FromQuery] string cronExpression = "*/1 * * * *", [FromBody] Parameters parameters = null)
{
RecurringJob.AddOrUpdate<JobsService>(
recurringJobId,
js => js.InvokeMethod(methodName, parameters),
() => cronExpression
);
}