WCF データ コントラクトを定義する場合、コレクション/リストにはどの型を使用する必要がありますか?
- ICollection<T>、IList<T>、T[]、または...?
- インターフェイス型または具体的な型を使用する必要がありますか?
- どのようなトレードオフを考慮する必要がありますか?
WCF データ コントラクトを定義する場合、コレクション/リストにはどの型を使用する必要がありますか?
注: 私はクライアントの観点からこれに答えています。つまり、/collectionType:<type>
スイッチをオンにしsvcutil.exe
ます (IDE でも利用可能です)。
個人的には、シンプルにして を使用する傾向がありますList<T>
。多くのデータ バインディングを行う場合はBindingList<T>
オプションかもしれませんが、オブジェクト プロパティの場合は通常やり過ぎです。配列は人生を非常に困難にします...それらを避けてください;-p
.NET 3.5 では、 の拡張メソッドのおかげで、各コレクション タイプで使用できる機能がぼやけていることに注意してくださいEnumerable
。
通常、拡張ポイントCollection<T>
を使用するためにコレクションをサブクラス化したい場合に便利です。virtual
これは、実際には WCF のオプションではありません。
既に述べたようにIList<T>
、生成されたクラスはコレクションを作成できないため、アセンブリ共有を使用していない限り、etc を使用することはできません。
シリアライザーはインターフェイス タイプのプロパティでは機能しないため、datacontract でインターフェイス タイプを使用することはできません。
MyClass[] や List などの具象型を使用できます
インターフェイス型を使用できないという事実を除けば、どのコレクション型を使用するかは問題ではありません。サービスのクライアントがそれらを見ることはありません。
Web サービスは、サービスの説明j を WSDL または mex の観点からクライアントに提供することに注意してください。WSDL の場合、クライアントは、送受信されるメッセージを記述した XML スキーマを受け取ります。コレクションの場合、クライアントには、maxOccurs="1" の要素ではなく、maxOccurs="unbounded" の要素が表示されます。クライアントは、これを配列やリストなどとして解釈できます。サービスからどのコレクションを返しても、クライアントは maxOccurs="unbounded" を見て、好きなように解釈します。
例外は何らかの辞書を返すことであり、それがどのように機能するかはわかりません。