如何解决只有公共方法能在迟发型后台调用?

问题描述 投票:1回答:1

我在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);
       }
    }
c# hangfire
1个回答
1
投票

拉姆达及其参数需要通过迟发型可序列化。据我所知,它的身体必须是一个简单的通话,例如没有方法分配。

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
           );
}
© www.soinside.com 2019 - 2024. All rights reserved.