10

ジェネリックコレクションを返すメソッドを持つWCFWebサービスがあります。さて、私の質問は次のとおりです。、、、、または他の何かとして公開する必要がICollection<T>ありList<T>ますか IList<T>IEnumerable<T>

CA1002エラーList<T>を回避したいので、それは問題外だと思いますが、基になるタイプはです。List<T>

私は、これについてのあなたの見解を聞くことに本当に興味があります。できれば、あなたが自分の考えを考える理由をよく説明してください。

前もって感謝します

4

2 に答える 2

18

CA1002などのエラーは、実際にはライブラリに適用されることを意図していることに注意してください。WCFサービスはライブラリではなく、SOAP、RESTなどを介してすべてをシリアル化するエンドポイントです。

ICollection<T>またはなどのインターフェースを公開しようとするIList<T>と、型をシリアル化できないというエラーが発生することがわかります。実際、ここでList<T>はおそらく最良の選択です。プロキシがクライアント側で生成されると、デフォルトで配列として生成され、ほとんどの人ではないにしても多くの人がプロキシをに変更するため、List<T>どのように公開するかに関わらず、90%の確率でプロキシがそのタイプになります。クライアントはとにかく見るつもりです。

一般に、WCF操作またはWebサービスからコレクションを「返さない」ことをお勧めします。必要なコレクションを含むプロキシクラスを作成し、それを返すのがより一般的です。

[OperationContract]
OrdersResult GetOrders(OrderRequest request);

プロキシクラスは次のようになります。

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

そうすれば、リクエストまたはレスポンスのいずれかにデータを追加する必要があると判断した場合でも、クライアントに重大な変更を加えることなく追加できます。


補遺:ここでのWCFの本当の問題は、特定のタイプがアウトバウンドデータにのみ使用されていることをWCFが認識していないことです。 いずれかのクラスがWCFサービスを介して公開される場合、WCFは、そのクラスが要求または応答のいずれかの一部である可能性があると想定し、それが要求の一部である場合、型は具体的である必要があり、不変であってはなりません。それが、プロパティセッターを要求するような他のすべてのばかげた制限の理由です。

ここでは、具体的で変更可能なコレクションタイプを使用する以外に選択肢はありません。ほとんどの場合、これは配列またはジェネリックリストのいずれかを意味します。

于 2010-02-19T14:54:48.917 に答える
6

私の意見では、シーケンスを公開するサービスおよびデータコントラクトは、それらがDTOとしてネットワーク上を移動しているため、それらのシーケンスが不変であることを明確に示す必要があります。別の層から受け取ったシーケンスを追加したり削除したりすることはあまり意味がありません。むしろ、あなたはそのデータを読み、それを使って何かをしたいのです。

それを考えると、私は本当に使用したいIEnumerable<T>のですが、残念ながら、これはWCFではうまく機能しません。特に遅延実行に関しては、あらゆる種類の奇妙なエラーが発生する可能性があるため、(WCFコンテキストでは)それらを回避するのが最善です。

残りのオプションの意図を最もよく伝えるため、実際には配列だけが残ります。

于 2010-02-19T14:56:49.183 に答える