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は、そのクラスが要求または応答のいずれかの一部である可能性があると想定し、それが要求の一部である場合、型は具体的である必要があり、不変であってはなりません。それが、プロパティセッターを要求するような他のすべてのばかげた制限の理由です。
ここでは、具体的で変更可能なコレクションタイプを使用する以外に選択肢はありません。ほとんどの場合、これは配列またはジェネリックリストのいずれかを意味します。