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.
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
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 :) –
Lol "unveränderlicher". Ich schätze, es ist so gut wie jede andere Erklärung. : P – Aaronaught