2010-02-19 5 views
9

Ich habe einen WCF-Webdienst mit einer Methode, die eine generische Auflistung zurückgibt. Nun, meine Frage ist: Sollte ich es als , List<T>, IList<T>, IEnumerable<T> oder etwas anderes aussetzen?WCF OperationContract - welcher generische Sammlertyp sollte ich veröffentlichen?

Ich nehme an, dass List<T> außer Frage, da ich CA1002 errors vermeiden will, aber der zugrunde liegende Typ wird ein List<T> sein.

Ich bin wirklich daran interessiert, Ihre Einstellungen zu hören, vorzugsweise mit einer guten Erklärung, warum Sie denken, was Sie denken.

Vielen Dank im Voraus

Antwort

16

Beachten Sie, dass Fehler wie CA1002 wirklich auf Bibliotheken anwenden sollen. Ein WCF-Dienst ist keine Bibliothek, es ist ein Endpunkt, der alles über SOAP, REST ist die Serialisierung usw.

Sie werden feststellen, dass, wenn Sie versuchen, eine Schnittstelle wie ICollection<T> oder IList<T> aussetzen, Sie Fehler erhalten werden, dass die Typ kann nicht serialisiert werden. In der Tat ist List<T> wahrscheinlich die beste Wahl hier. Wenn ein Proxy auf der Client-Seite generiert wird, wird er standardmäßig als Array angezeigt, und viele, wenn nicht die meisten Leute, ändern ihn in List<T>, also 90% der Zeit, egal wie man ihn entlarvt, das ist der Typ dass der Klient sowieso sehen wird.

Ich werde feststellen, dass es in der Regel gute Praxis ist, eine Sammlung überhaupt nicht von einem WCF-Betrieb oder einem Webdienst im Allgemeinen "zurückzugeben". Es ist häufiger eine Proxy-Klasse zu erstellen, die die Sammlung enthält, die Sie wollen, und zurück, dass, das heißt:

[OperationContract] 
OrdersResult GetOrders(OrderRequest request); 

Wenn die Proxy-Klasse könnte wie folgt aussehen:

[DataContract] 
public class OrdersResult 
{ 
    [DataMember] 
    public List<Order> Orders { get; set; } 
} 

Auf diese Weise, wenn Sie Sie sich entscheiden, Sie müssen entweder der Anforderung oder der Antwort weitere Daten hinzufügen, ohne dass dadurch Änderungen am Client vorgenommen werden.


Nachtrag: Das eigentliche Problem hier mit WCF ist, dass WCF nicht weiß, dass eine bestimmte Art nur für abgehende Daten verwendet wird. Wenn jede Klasse durch einen WCF-Dienst ausgesetzt ist, WCF nimmt an, dass es ein Teil von entweder einer Anfrage oder Reaktion sein kann, und wenn es einen Teil eines Anfrage, wird der Typ muss Beton ist und kann nicht unveränderlich sein. Das ist der Grund für all die anderen albernen Einschränkungen wie die Anforderung von Immobilien-Setter.

Sie haben hier einfach keine andere Wahl, als einen konkreten, veränderbaren Sammlertyp zu verwenden. In den meisten Fällen bedeutet dies entweder ein Array oder eine generische Liste.

6

Meiner Meinung nach, Service und Datenverträge, die Sequenzen aussetzen sollte klar signalisieren, dass diese Sequenzen sind unveränderlich, da sie über den Draht als DTOs reisen. Es macht keinen großen Sinn, eine Sequenz, die Sie von einer anderen Ebene erhalten haben, hinzuzufügen und zu entfernen. Vielmehr möchten Sie diese Daten lesen und etwas damit machen.

Angesichts dieser würde ich wirklich lieber IEnumerable<T> verwenden, aber leider funktioniert das einfach nicht gut mit WCF. Sie können alle möglichen seltsamen Fehler bekommen, besonders wenn es um verzögerte Ausführung geht, also ist es (in einem WCF-Kontext) am besten, sich von diesen fernzuhalten.

Das verlässt wirklich nur Arrays, da sie Absicht der besten verbleibenden Optionen kommunizieren.

+0

Stimmen Sie mit dem Teil über Unveränderlichkeit überein, obwohl Arrays wirklich nicht mehr unveränderlich sind als generische Listen; Nur die * Größe * ist unveränderlich. – Aaronaught

+1

Ja, ich weiß, weshalb ich IEnumerable bevorzugt hätte, aber da dies keine Option ist, müssen wir uns mit dem nächstbesten zufrieden geben. Arrays sind immer noch "unveränderlicher" als Listen, weil Sie die Größe nicht ändern können, also kommunizieren sie die Absicht ein wenig klarer ... aber nicht viel, ich werde es gewähren :) –

+1

Lol "unveränderlicher". Ich schätze, es ist so gut wie jede andere Erklärung. : P – Aaronaught

Verwandte Themen