Generische Rückgabetypen mit Schnittstellentypparametern in WCF

9

Wie kann ich Schnittstellentypen in generischen Typparametern aus dem OperationContracts in meinem WCF REST-Service zurückgeben? Genauer gesagt funktioniert es für eine Operation, aber nicht, wenn ich eine zweite Operation mit einem generischen T hinzufüge, das eine Schnittstelle ist.

Ich verwende JSON als Anfrage- und Antwortformat und füttere einen Nicht-WCF-Client, der die JSON-Antworten für die benötigten Daten analysiert. Ich verwende nicht SOAP oder die vom Dienst generierte WSDL.

Meine Serviceschnittstelle:

%Vor%

Ich habe GetCount() und GetDescription() im Beispiel gelassen, um darauf hinzuweisen, dass diese beiden generischen Ergebnisse gut funktionieren, aber offensichtlich sind sie konkrete Typen. Und sogar GetFooData() funktioniert gut, bis ich eine zweite Methode von IServiceResult<T> hinzufüge, wobei T eine Schnittstelle ist.

Die Rückgabetypen von GetFooData() und GetBarData() sind nicht identisch, ebenso wenig die konkreten Klassen, die sie implementieren.

Sie können sich vorstellen, dass ich die Implementierung auf ein Skelett reduziert habe, da ich nicht glaube, dass die Implementierung der Kern des Problems ist:

%Vor%

Und die Fehlermeldung beim Aufruf von GetBarData() vom Browser:

%Vor%

Der Rest der Fehlermeldung ist ein Hinweis auf kollidierende Sammlertypen List<Test> und Test[] , was hier nicht der Fall ist.

Offensichtlich sind IFooData und IBarData nicht identisch, ebenso wenig wie die Klassen, die sie implementieren.

Warum also ServiceResult<IFooData> und ServiceResult<IBarData> beide auf ServiceResultOfanyType auflösen?

Fehle ich etwas oder gibt es keine Möglichkeit, das zu beheben?

    
JMD 28.03.2013, 00:32
quelle

1 Antwort

5

Nach vielen Versuchen habe ich endlich mit minimalen Änderungen gearbeitet:

  • Meine Servicevorgänge geben jetzt ServiceResult<T> anstelle von IServiceResult<T> zurück. Tatsächlich ist IServiceResult<T> jetzt komplett verschwunden.
  • GetServiceKnownTypes() gibt nicht mehr alle Varianten von ServiceResult<T> zurück. Ich gebe nur das DataContract s zurück, das als T verwendet wird.

    %Vor%

Ich kann jetzt alle diese Methoden aufrufen und Listen von generischen Typen abrufen, auf die ihre Schnittstellen in ServiceContract verweisen.

    
JMD 02.04.2013, 22:13
quelle