9


1

WCF OperationContract-どのジェネリックコレクションタイプを公開する必要がありますか?

ジェネリックコレクションを返すメソッドを持つWCF Webサービスがあります。 さて、私の質問は次のとおりです。「ICollection」、「List」、「IList」、「IEnumerable」などとして公開する必要がありますか?

CA1002 errorsを避けたいので、 List`は問題外だと思いますが、基になる型は List`になります。

私はあなたの意見を聞くことに本当に興味があります。

前もって感謝します

2 Answer


17


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

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

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

[OperationContract]
OrdersResult GetOrders(OrderRequest request);

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

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

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

'' '' '

補遺:ここでのWCFの実際の問題は、* WCFは特定のタイプがアウトバウンドデータのみに使用されることを認識していないことです*。クラスがWCFサービスを介して公開される場合、WCFは_response_、および_request_の一部である場合、タイプは_concrete_でなければならず、__ immutable_であってはなりません。 これが、プロパティセッターの要求など、他のすべての愚かな制限の理由です。

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


6


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

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

残りのオプションの中で最も良い意図を伝えるので、実際には*配列*だけが残ります。