Olá!
Geralmente eu crio uma classe que implementa IStatefulJob e no metódo Execute, chamo a classe de negócio.
public class HomeControllerJob : IStatefulJob
{
public void Execute(...)
{
new HomeController().foo();
}
}
Para criar o Job:
JobDetail jobDetail = new JobDetail("lembrete", null, typeof(HomeControllerJob));
A interface IStatefulJob funciona como a IJob, com a diferença que o schedule não dispara uma nova trigger se houver alguma em execução. Isso é muito mais seguro.
Geralmente, uso as triggers olhando algum status de tabela.
Por exemplo, tenho uma trigger que olha a cada minuto se na tabela “embarque”, existe algum embarque que ainda não foi faturado, pelo campo status, para enviar ao faturamento.