Melhor maneira de usar List e expondo Collection
-
10-07-2019 - |
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 deAdd(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 implementaAdd(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)
Solução
List
Em termos da pergunta original, você pode embrulhar um List
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 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