WCF OperationContract – qual tipo de coleção genérica devo expor?

Eu tenho um serviço da web WCF que tem um método que retorna uma coleção genérica. Agora, minha pergunta é: Devo expô-lo como ICollection , List , IList , IEnumerable ou algo mais?

Suponho que List esteja fora de questão, pois quero evitar erros do CA1002 , mas o tipo subjacente será uma List .

Estou realmente interessado em ouvir suas opiniões sobre isso, de preferência com uma boa explicação de por que você pensa o que pensa.

desde já, obrigado

Tenha em mente que erros, como o CA1002, devem ser aplicados às bibliotecas. Um serviço WCF não é uma biblioteca, é um endpoint que está serializando tudo sobre SOAP, REST etc.

Você verá que, se tentar expor uma interface como ICollection ou IList , você receberá erros de que o tipo não pode ser serializado. De fato, List é provavelmente a melhor escolha aqui. Quando um proxy é gerado no lado do cliente, ele é, por padrão, uma matriz, e muitas, se não a maioria das pessoas, o alteram para uma List , portanto, 90% do tempo, independentemente de como você o expõe, esse é o tipo que o cliente vai ver de qualquer maneira.

Vou observar que geralmente é uma boa prática não “retornar” uma coleção de uma operação do WCF ou de um serviço da Web em geral. É mais comum criar uma class de proxy que contenha a coleção desejada e retorná-la, por exemplo:

 [OperationContract] OrdersResult GetOrders(OrderRequest request); 

Onde a class de proxy pode ser assim:

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

Dessa forma, se você decidir adicionar mais dados à solicitação ou à resposta, poderá fazê-lo sem causar interrupções no cliente.


Adendo: O problema real aqui no WCF é que o WCF não sabe que um determinado tipo é usado apenas para dados de saída. Quando qualquer class é exposta por meio de um serviço WCF, o WCF pressupõe que ela pode fazer parte de uma solicitação ou de uma resposta e, se fizer parte de uma solicitação , o tipo deve ser concreto e não pode ser imutável . Essa é a razão para todas as outras restrições bobas, como a exigência de estabelecimento de propriedades.

Você simplesmente não tem escolha aqui, a não ser usar um tipo de coleção concreto e mutável e, na maioria dos casos, isso significa uma matriz ou uma lista genérica.

Na minha opinião, os contratos de serviços e dados que exponham sequências devem sinalizar claramente que essas sequências são imutáveis , uma vez que estão viajando pela rede como DTOs . Não faz muito sentido adicionar e remover uma sequência recebida de um nível diferente. Em vez disso, você quer ler esses dados e fazer algo com eles.

Dado que, eu realmente prefiro usar IEnumerable , mas infelizmente, isso simplesmente não funciona bem com o WCF. Você pode obter todos os tipos de erros estranhos, particularmente quando se trata de execução adiada, então (em um contexto WCF) é melhor ficar longe deles.

Isso realmente só deixa arrays , uma vez que eles comunicam melhor a intenção das opções restantes.