WCF Service Reference generiert eine eigene Vertragsschnittstelle, die meine nicht wiederverwendet
Meine erste Frage, hoffe so ist es geeignet:
Gemeinsame Schnittstelle Montage - ich habe einen 'shared' - assembly, die eine Schnittstelle besitzt, nennen wir es IDocRepository
. Es ist gekennzeichnet mit [ServiceContract]
und es gibt mehrere [OperationContract]
-markierten Methoden.
WCF-Implementierung Baugruppen - ich habe zwei WCF-service-Projekte, jeder Verweis auf die freigegebene assembly, jeder der diese Schnittstelle implementiert, als WCF-Dienst.
Verbraucher Montage - Endlich habe ich eine 'client' - Projekt, auch das verweisen auf die freigegebene assembly, mit einem Verweis auf jeden von den zwei WCF-Dienste.
Jedoch, die service-Referenzen erzeugt, in dem der Verbraucher die Montage stammen aus einer automatisch generierten version der Schnittstelle:
public partial class ExampleClient : System.ServiceModel.ClientBase<SomeNamespace.ExampleSvcRef.IDocRepository>, SomeNamespace.ExampleSvcRef.IDocRepository {
Was ich erwartet
Ich hätte gehofft, dass beide Verweise stattdessen Erben automatisch die Schnittstelle, die ich definiert, dass der Verbraucher/Kunde Montage ist auch die Referenzierung. Wie bei der Wiederverwendung von Klassen, die es bietet für die parameter-und Rückgabetypen, aber für die service-Schnittstelle.
Warum
So kann ich erstellen Sie eine Instanz der service-Referenz-proxy und warf es zu meinem interface geben.
So, ich könnte ändern Sie den generierten code von hand jedes mal, aber es sollte besser Weg...?
(edit: ich habe 'die Wiederverwendung von Typen der referenzierten assemblies' und 'Wiederverwendung von Typen in alle referenzierten Assemblys" - Optionen für service Referenzen)
InformationsquelleAutor der Frage Kieren Johnstone | 2010-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
"Reuse types in referenzierten Assemblys" können Sie nur die Wiederverwendung von Daten-Verträge, keine Service-Verträge. Wenn Sie möchten, zu teilen, Service-Verträge, die Sie nicht benötigen, verwenden Sie "Add Service Reference". Sie können einfach verwenden Sie ChannelFactory direkt.
Kanal-Objekt auch umsetzen ICommunicationObject, so können Sie wirken, wenn Sie anrufen müssen Methoden wie Open() oder Close().
InformationsquelleAutor der Antwort Quartermeister
Beim erstellen der service-Referenz, es ist ein Feld können Sie ein Häkchen, um es wiederzuverwenden, die gemeinsame Definitionen. Stellen Sie sicher, dass das client-Projekt ist bereits verweisen auf die freigegebene assembly, fügen Sie den Dienstverweis erneut und prüfen Sie alle Optionen sorgfältig.
Wenn es immer noch nicht funktioniert, überprüfen Sie die Bindung, die Sie verwenden. Ich habe eine vage Erinnerung, dass die basic-HTTP-Bindung nicht die Unterstützung der Wiederverwendung von Typen?
InformationsquelleAutor der Antwort David M
Es ist eine weitere gute option, wenn Sie fortsetzen wollen zu verwenden, der proxy-generator für die Sie beschränkt-aber-etwas-nützliches-Funktionalität... mit einer partiellen Klasse:
Sicherzustellen, dass der proxy code-Generierung die gleiche Weise Ihre Service-Vertrag ist es zu definieren, dh, wenn es mit der 'Liste', verwenden Sie diese option in der Konfiguration von Service Referenzen. In anderen Worten, stellen Sie sicher, dass die generierten Service-Interface ist genau gleich zu Ihrem real-Service-Schnittstelle und der obige code sollte funktionieren, und zum aktualisieren der Referenz, die Sie verwenden der rechten Maustaste klicken, anstatt code zu schreiben.
InformationsquelleAutor der Antwort Jesse Anderson
Visual Studio nicht unterstützt wiederverwenden Sie vorhandene Schnittstelle, die beim generieren der proxy-Klassen für Sie. Die Wiederverwendung von Typen wird nicht die Wiederverwendung der Vertrag Schnittstelle als Quartermeister hingewiesen.
Wir haben es gelöst mit Vererbung. Ganz ähnlich wie die partielle Klasse Idee oben vorgeschlagen von Jester-Software.
Dies ist, wie wir es gelöst:
In das Projekt Ihres Kunden erstellen Sie einfach eine service-Referenz, wie Sie getan haben würde. Fügen Sie eine Klasse, dient als Ersatz für den client:
Diese Klasse erbt von der generierten MyServiceClient aber heißt es, dass die client tut implementieren die ursprüngliche Schnittstelle.
(Ich schlage vor, Sie setzen Sie Sie in einen Ordner mit dem Namen "ServiceProxies")
Wenn die MyServiceClient-Klasse enthält alle Methoden, die nicht übereinstimmen mit der ursprünglichen Schnittstelle Sie können dann fügen Sie Sie in die proxy-und die Umwandlung nicht im code.
Danach verwenden Sie einfach die MyServiceProxy, wo Sie gebraucht hätte MyServiceClient.
InformationsquelleAutor der Antwort Ron Deijkers