Ich habe einen WCF-Dienst, der eine große Anzahl von Dienstmethoden an einer einzelnen Endpunktadresse verfügbar macht. Bisher sind alle Service-Methoden in einer einzigen Service-Vertragsklasse implementiert. Diese Servicevertragsklasse implementiert mehrere Servicevertragsschnittstellen. Nun möchte ich die Implementierung der Servicevertragsmethoden in mehrere Klassen aufteilen, um zu vermeiden, dass die Kontraktklasse zu groß wird. Ich verwende ein Self-Hosting-Szenario mit einem ServiceHost. Der ServiceHost nimmt nur den Typ eines einzigen Typs an, der die Service-Methoden implementiert, es scheint also, dass alles in dieser Klasse implementiert werden muss. Natürlich kann das Fleisch der Methoden in mehrere Klassen eingeteilt werden. Aber gibt es auch eine Möglichkeit, die Methoden in mehrere Klassen aufzuteilen?WCF Große Schnittstelle an einer einzigen Endpunktadresse
Antwort
Sie können den Dienst als partial class implementieren, mit dem Sie die Implementierung in mehrere Dateien aufteilen können.
Wenn die Anforderung darin besteht, einen einzelnen Endpunkt und eine einzelne Schnittstelle beizubehalten, gibt es keine andere Möglichkeit, sie aufzuteilen - die eine Klasse, die Sie erstellen, muss die gesamte Schnittstelle implementieren.
Ich würde vorschlagen, die Service-Implementierung so einfach wie möglich zu halten, und nur jede Methode ein One-Liner sein, der die Operation an die tatsächliche Implementierung delegiert, die dann auf mehrere Klassen aufgeteilt werden kann. Vielleicht würde es sogar Sinn machen, einen pro Operation zu machen? Das ist ein Muster, das ich vorher mit Erfolg benutzt habe.
Sie können so viele Serviceverträge erstellen, wie Sie möchten, jeder mit seiner eigenen Logik dahinter.
Der Vorteil dieses Ansatzes besteht darin, dass Sie, wie es Ihnen scheint, logisch verwandte Funktionen gruppieren.
Der Nachteil ist, dass der aufrufende Client jetzt wissen muss, welcher Dienst beim Aufruf der Funktion verwendet werden soll.
Es ist ein guter Ansatz, die Anzahl der Operationen im Service zu begrenzen. Wie ich Ihr Szenario im Moment verstehe, haben Sie Single-Service-Implementierung, die mehrere Service-Verträge implementiert. Dies bedeutet, dass Sie bereits mehrere Endpunkte in Ihrem Dienst haben - jeder Endpunkt weist einen einzelnen Vertrag auf. In diesem Fall ist Ihr Kunde bereits bereit, für jeden benötigten Vertrag einen separaten Proxy zu erstellen.
Jetzt möchten Sie Ihre Service-Implementierungsklasse in mehrere Service-Implementierungen aufteilen. Jede Service-Implementierung implementiert einen (oder einen kleineren Satz) Service-Verträge. Dies erfordert eine Änderung Ihrer Hosting-Anwendung - Sie benötigen für jede Service-Implementierung einen separaten ServiceHost. Sie benötigen außerdem eine separate Konfiguration und eindeutige Adresse für jede Service-Implementierung.
Client-Seite kann nur mit neuen Diensten neu erstellt werden, aber ich denke, es sollte auch möglich sein, Adressen für Endpunkte einfach zu ändern, und es sollte funktionieren.
Vielen Dank für Ihre Antwort. Ich plane und implementiere derzeit eine Datenaustauschschnittstelle für ein ziemlich großes System. Clients werden höchstwahrscheinlich immer die gesamte Schnittstelle und möglicherweise verschiedene Plattformen verwenden. In solch einem Szenario ist es für den Client am einfachsten, nur eine einzige Endpunktadresse zu haben. Ich habe mehrere Servicevertragsschnittstellen erstellt und eine "Masterschnittstelle" von allen Servicevertragsschnittstellen erben lassen. Die Serviccice-Vertragsklasse implementiert dann die Master-Schnittstelle. – WalterOesch
Vielen Dank für Ihre Antwort. Ich habe auch über Teilklassen nachgedacht, aber meiner Meinung nach helfen Teilklassen nicht dabei, eine Lösung einfach zu halten. Ich werde gehen, wie Sie vorgeschlagen, mit einem einzigen Liner für jede Operation – WalterOesch