Library Kata “Windows Service”

Implementiere eine Bibliothek, mit der ein Windows Service auf einfache Weise realisiert werden kann.

Als Anwender eines Windows Service möchte ich diesen mit folgendem Befehl auf der Kommandozeile installieren können:

C:\> myservice /install

Dadurch ist der Service im System bekannt und unter Systemeinstellungen/Services sichtbar. Im Anschluss möchte ich ihn starten mit dem Betriebssystembefehl

C:\> net start myservice

Ebenso möchte ich ihn stoppen können mit

C:\> net stop myservice

Der Service soll mit folgendem Befehl wieder deinstalliert werden können:

C:\> myservice /deinstall

Der Entwickler eines Windows Service muss folgendes Interface implementieren, um die Bibliothek nutzen zu können:

public interface IService
{
    string Name { get; }

    string DisplayName { get; }

    string Description { get; }

    void OnStart();

    void OnStop();
}

Eine Klasse, die dieses Interface implementiert, kann dann mit Hilfe der Bibliothek als Windows Service ausgeführt werden. Dies soll mittels der zu implementierenden Klasse EasyService wie folgt möglich sein:

public static void Main(string[] args) {
   var myService = new MyService();
   EasyService.Run(myService, args);
}

In diesem Beispiel implementiert die Klasse MyService das oben gezeigte Interface IService. Die Instanz sowie die Kommandozeilenargumente werden an die Run Methode übergeben. Run interpretiert die Argumente, um den Service bei Bedarf zu installieren oder zu deinstallieren.

Variation #1

Um nicht gezwungen zu sein, das Interface IService zu implementieren, soll der Service auch auf folgende Weise gestartet werden können:

public static void Main(string[] args) {
   var myService = new MyService();
   EasyService.Run(
      "myservice",
      "MyService",
      "Ein ziemlich nutzloser Service",
      () => myService.OnStart(),
      () => myService.OnStop(),
      args);
}

Die ersten drei String-Parameter entsprechenden den Eigenschaften Name, DisplayName und Description des Interfaces. OnStart und OnStop werden durch Lambda Expressions vom Typ Action übergeben. MyService muss nun das Interface IService nicht implementieren.

Variation #2

Der Service soll auch ohne Installation ausgeführt werden können, indem ich auf der Kommandozeile folgenden Befehl gebe:

C:\> myservice /run

Dies erleichtert das Debuggen des Service.

de_DEGerman