mir ist leider kein passender Titel eingefallen darum versuche ich mein Problem hier etwas zu erläutern:
Es soll ein Scheduler erstellt werden welcher zu bestimmten Zeitpunkten "Tasks" starten soll.
Diese verschiedenen "Tasks" werden in einer Datenbank - SQLServer - gespeichert.
Solch ein Task beinhaltet unter anderem die Felder wie Id, Beschreibung, Timestamps, Parameter, etc..
Diese Task können unterschiedliche Funktionen ausführen:
-
- Starten einer Batchdatei (.cmd) (kann unter Umständen zusätzliche Parameter beinhalten)
- Download einer Datei eines FTP-Servers (benötigt Usernamen und Passwort)
- Auswerten einer Logdatei (Pfad zur Logdatei)
- Versenden eines E-Mails (E-Mail EMpfänger, Betreff, ...)
Alle diese Funktionen müssen ein Interface (IFunction) implementieren welches im Prinzip nur 2 Member beinhaltet:
public interface IFunction
{
string Description { get; }
Task PerformAsync();
}
Eine Implementierung dieses wäre zB.:
public class DelayedTestFunction : IFunction
{
public string Description
{
get { return "Testfunktion mit einem Delay von 3 Sekunden"; }
}
public async Task PerformAsync()
{
await Task.Delay(3000);
System.Diagnostics.Debug.Print("Testfunktion");
}
}
Das Hauptprogramm hält nun eine Liste mit IFunctions und führt diese dann zu bestimmten Zeitpunkten aus.
Nun zum Problem:
Wie kann ich diese Tasks in der Datenbank abspeichern, damit ich diese dann auch wieder laden kann?
Genauer gesagt wie weiß ich, dass z.B.: der Task mit der ID 1 eine "BatchFunction" ist damit ich dieser auch beim Instanziieren die notwendigen Parameter mitgeben kann? Sollte ich hier eine Art Factory erstellen welche anhand eines Identifiers diese erstellt?
public static class FunctionFactory
{
public static IFunction GetFunction(int id, string parameter)
{
switch(id)
{
case 1:
return new DelayedTestFunction();
case 2:
return new BatchFunction(parameter);
default:
throw new ArgumentException("nix gefunden");
}
}
}
Am schönsten wäre es ja, wenn eine neue Funktion hinzugefügt wird, diese ohne große Änderungen/Anpassungen verwendet werden kann.
Gibt es für diese Art "Problem" eine saubere Lösung bzw. eine Art Standard wie man so etwas umsetzen sollte??
Falls noch etwas unklar sein sollte bitte einfach fragen.
lg
fichz