2017-08-09 1 views
1

J'expérimente FluentScheduler pour certaines tâches d'arrière-plan dans ASP.net Core API.Injection de dépendances FluentScheduler dans le constructeur

Le travail doit envoyer des notifications push tous les jours à un intervalle de temps donné en fonction de quelques critères. J'ai parcouru le document et mis en œuvre une fonctionnalité de test pour imprimer certaines sorties dans la fenêtre de la console. Cela a fonctionné comme prévu avec l'intervalle de temps prévu.

Mais le travail que je vais faire avec cela implique un contexte de base de données qui fournit les informations nécessaires pour effectuer les critères d'envoi des notifications.

Mon problème est que je ne peux pas utiliser constructeur avec paramètre dans MyJob classe qui jette manque exception méthode

PS: Selon cet article de Scott Hanselman, FluentScheduler semble être assez célèbre, mais je ne pouvais pas obtenir de l'aide des communautés en ligne. Mais évidemment, c'est assez facile à saisir.

public class MyJob : IJob 
{ 
    private ApplicationDbContext _context; 

    public MyJob(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public void Execute() 
    { 
     Console.WriteLine("Executed"); 
     SendNotificationAsync(); 
    } 

    private async Task SendNotificationAsync() 
    { 
     var overdues = _context.Borrow.Join(
      _context.ApplicationUser, 
      b => b.ApplicationUserId, 
      a => a.Id, 
      (a, b) => new { a, b }) 
      .Where(z => (z.a.ReturnedDate == null) && (z.a.BorrowApproval == 1)) 
      .Where(z => z.a.ReturnDate.Date == new DateTime().Date.AddDays(1).Date) 
      .Select(z => new { z.a.ApplicationUserId, z.a.Book.ShortTitle, z.a.BorrowedDate, z.b.Token }) 
      .ToList(); 

     Console.WriteLine("Acknowledged"); 

     foreach (var r in overdues) 
     { 
      string message = "You are running late! The book '" + r.ShortTitle + "' borrowed on '" + r.BorrowedDate + "' due tomorrow."; 
      Console.WriteLine(message); 
      await new PushNotificationService().sendAsync(r.Token, "Due Tomorrow!", message); 
     } 
    } 
} 

Répondre

0

De l'source code pour ijob, il ressemble à votre classe qui implémente ijob doit avoir un constructeur par défaut parameterless. Depuis FluentScheduler également supports lambdas, il peut être plus facile d'avoir votre bibliothèque d'injection de dépendance créer votre objet, puis appeler la méthode Execute comme ceci:

var myJob = new MyJob(new ApplicationDbContext()); 
Schedule(() => myJob.Execute()).ToRunEvery(1).Days().At(21, 15); 

ou appelez le constructeur vous:

// Schedule a job using a factory method and pass parameters to the constructor. 
Schedule(() => new MyJob(new ApplicationDbContext())).ToRunNow().AndEvery(2).Seconds(); 
+0

nouvelle ApplicationDbContext() L'objet instancié n'est-il pas déjà supposé être de la part de ConfigureServices? – Kirk

+0

C'est juste un espace réservé pour cependant que vous obteniez 'ApplicationDbContext' –

+0

new MyJob (new ApplicationDbContext()) n'accepte pas. même erreur qu'aucune erreur de méthode mssing – Kirk