2017-08-09 1 views
1

Ich experimentiere mit FluentScheduler für einige Hintergrundaufgaben in ASP.net Core API.FluentScheduler Abhängigkeitsinjektion in Konstruktor

Der Job sollte Push-Benachrichtigungen jeden Tag in einem bestimmten Zeitintervall basierend auf wenigen Kriterien senden. Ich hatte das Dokument durchgesehen und eine Testfunktion implementiert, um einige Ausgaben im Konsolenfenster auszugeben. Es funktionierte wie erwartet mit dem vorhergesagten Zeitintervall.

Aber der eigentliche Job, den ich damit machen werde, beinhaltet den Datenbankkontext, der die notwendigen Informationen liefert, um die Kriterien zum Senden der Benachrichtigungen zu erfüllen.

Mein Problem ist, vermag ich nicht Konstruktor in MyJob Klasse mit dem Parameter zu verwenden, die

PS fehlt Methode Ausnahme wirft: Gemäß diesem Artikel von Scott Hanselman, scheint FluentScheduler ziemlich berühmt zu sein, aber ich konnte es nicht Holen Sie sich Hilfe von Online-Communities. Aber offensichtlich ist es ziemlich einfach zu verstehen.

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); 
     } 
    } 
} 

Antwort

0

Vom source code für ijob sieht es aus wie Ihre Klasse, die einen parameter Standardkonstruktors ijob muss haben implementiert. Da FluentScheduler auch supports lambdas, kann es einfacher sein, Ihre Dependency Injection-Bibliothek, um Ihr Objekt erstellen, dann rufen Sie die Execute Methode wie folgt:

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

oder rufen Sie den Konstruktor selbst:

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

neuer ApplicationDbContext() Soll das Objekt nicht bereits von ConfigureServices instanziiert werden? – Kirk

+0

Es ist nur ein Platzhalter für, aber Sie erhalten 'ApplicationDbContext' –

+0

neue MyJob (neue ApplicationDbContext()) akzeptiert nicht. selbe Fehler wie kein Mssing Methodenfehler – Kirk

Verwandte Themen