Laden...

WCF: ServiceHost gemeinsamer Zugriff via statischen Klassen - bessere Lösung?

Erstellt von DesertView vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.780 Views
D
DesertView Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren
WCF: ServiceHost gemeinsamer Zugriff via statischen Klassen - bessere Lösung?

Hallo Forum,

ich habe folgende Situation:*Einen Windows NT Dienst, der einen Timer betreibt welcher nach Ablauf Arbeit ausführt und den Timer neustartet *Einen WCF Dienst der von eben genanntem Windows NT Dienst gehostet wird *Eine grafische Oberfläche im Netzwerk die sich als Client mit dem WCF Dienst verbindet *Die grafische Oberfläche kann den Timer steuern und Konfigurations Dateien ändern, jeweils durch Befehle über den WCF Server.

Umgesetzt ist das ganze wie in der angehängten Abbildung gezeigt:*Die Klasse WindowsNTDienst implementiert ihrem Namen nach einen Windows NT Dienst und hostet mit der Klasse ServiceHost den WCF Dienst *Eigentliche Arbeit ist in den statischen Klassen Timer und Worker auf die sowohl vom WindowsNTDienst als auch von einer Instanz des WcfDienstes zugegriffen werden kann (da statisch) *Die statischen Klassen sind mit

lock(...) {...}

threadsicher gemacht

Meine Frage(n) nun:*Ist der Aufbau für diese Situation korrekt oder wird das professionell anders gelöst? *Mit gefällt dieser Umweg über statische Klassen für die eigentliche Arbeit nicht sehr, gibt es hier noch weitere Möglichkeiten, bei bestehen der Mehrbenutzermöglichkeit? *Oder ist der Ansatz generell falsch, zum Steuern einen WCF-Dienst zu benutzen? Vom Prinzip die Grundfrage aus diesem, leider unbeantwortetem Thread: Frage zu WCF-Hosting

Schon mal vielen Dank für eure Hilfe!

16.835 Beiträge seit 2008
vor 7 Jahren

Statische Klassen sind (mit Ausnahmen) ein Hinweis auf ein Fehldesign; sie lassen sich auch nicht oder nur eingeschränkt testen.
Wenn man nun wüsste, was diese Jobs (statischen Klassen) tun, kann man Dir sicherlich inhaltlich besser helfen; ins Blaue geraten könnte das gut einfach nur nen simpler Command Pattern sein, wie er bei Queues oft ine Rolle spielt.

WCF ist hier ja nur die kommunikative Komponente, was man so prinzipiell schon machen kann.
Die eigentliche Ausführung ist ja einfach nur der Windows Service; da würde auch mehr oder weniger die Logik rein gehören, weil ein WCF Dienst zur Ausführung ja immer einen Thread der Kommunikation benötigt.

D
DesertView Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren

Herzlichen Dank für deine Antwort Abt!

Du hast recht, die Logik war ursprünglich auch im Windows Service. Um aber dem ServiceHost bzw. der Instanz des WCF-Services Zugriff zu ermöglichen, wurde diese in statische Klassen ausgelagert.

Zum Inhalt der eigentlichen Arbeit:*Datenbankverbindung öffnen und Daten auslesen *Daten auf FTP-Server laden *Konfigurationsdatei lesen *Timer je nach Konfiguration stellen *[wiederholen]

Der WCF benötigt Zugriff auf den Timer um diesen zu Steuern (Stoppen, Starten)

D
985 Beiträge seit 2014
vor 7 Jahren

Du benötigst in deiner Anwendung ein "Singleton".

Das kann man:

  • über eine statische Klasse lösen
  • über eine Klasse lösen, die sich nur einmal erzeugen lässt
  • über eine ganz normale Klasse und einen DI-Container, der bei jeder Anfrage nach eben dieser Klasse nur einmal eine Instanz erzeugt und dann immer wieder diese Instanz herausgibt.

Ich empfehle Tor 3. Die beiden anderen haben Ziegenblut ;o)