Pergunta

I deve implementar um serviço web que expõem uma lista de valores (inteiros, classes personalizadas etc). Meu trabalho solução retorna um List<T>, e de acordo com FxCop é melhor para retornar um Collection<T> ou ReadOnlyCollection<T>.

Se eu optar por retornar um ReadOnlyCollection<T>, os shows de serviços web um erro como:

Para ser serializado XML, tipos que herdam ICollection deve ter uma implementação de Add(System.Int32) em todos os níveis de sua hierarquia de herança. System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] não implementa Add(System.Int32).

Qual é a sua maneira favorita de usar internamente uma List<T> e expor um Collection<T>? (Usando C #, e de preferência quadro 2.0 apenas)

Foi útil?

Solução

List ou Collection são muito bem neste caso.

Em termos da pergunta original, você pode embrulhar um List em um Collection de maneira muito simples:

List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);

Este é um verdadeiro invólucro; adicionar um item para o wrapper (COL), e ele é adicionado à lista. Isso pode ser um pouco confuso, pois muitos desses construtores usam o argumento para fazer a população inicial, mas não link para a lista original. Collection é uma exceção ;-p

Uma vez que você está em um limite de serviço web, que recomendação de FxCop não se aplica. Isso é útil (em linha com Eric Lippert do recente blogue ) para impedir que um stomping chamador sobre a memória do receptor - mas em um cenário de web-service distribuído que simplesmente não se aplica. Na verdade, desde web-services tem alguns problemas bem documentados com determinados cenários genéricos, uma matriz simples é sem dúvida muito útil e pragmático em um limite de serviço web. No contexto do blog de Eric - neste caso, não há dúvida da questão chamador / receptor, uma vez que existe uma barreira imposta entre os dois.

Em termos de WSDL / mex, eu suspeito que todos os 3 (lista / coleta / matriz) só vai se tornar um bloco de elementos -. Assim você pode um poço ir com o que for mais conveniente

Outras dicas

Eu costumo retornar IList de um serviço web WCF: FxCop é suficiente feliz com isso. Não tenho certeza se isso funciona com serviços web ASMX.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top