Pregunta

Debo implementar un servicio web que exponga una lista de valores (enteros, clases personalizadas, etc.). Mi solución de trabajo devuelve una List < T > , y de acuerdo con FxCop, es mejor devolver una Collection < T > o ReadOnlyCollection < T > .

Si elijo devolver una ReadOnlyCollection < T > , el servicio web muestra un error como:

  

Para ser serializable en XML, los tipos que heredan de ICollection deben tener una implementación de Add (System.Int32) en todos los niveles de su jerarquía de herencia.    System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] no implementa Add (System.Int32) .

¿Cuál es su forma favorita de usar internamente una List < T > y exponer una Collection < T > ? (usando C #, y preferiblemente solo framework 2.0)

¿Fue útil?

Solución

Lista < T > o Colección < T > están bien en este caso.

En términos de la pregunta original, puede ajustar una Lista < T > en una colección < T > muy simple:

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

Este es un verdadero contenedor; agregue un elemento al contenedor (col) y se agregará a la lista. Esto puede ser un poco confuso, porque muchos de estos constructores usan el argumento para hacer la población inicial, pero no se vinculan a la lista original. Colección < T > es una excepción ;-p

Dado que se encuentra en un límite de servicio web, esa recomendación de FxCop no se aplica. Eso es útil (en línea con reciente de Eric Lippert blog ) para evitar que una persona que llama pise la memoria de la persona que llama, pero en un escenario distribuido de servicio web que simplemente no se aplica. De hecho, dado que los servicios web tienen algunos problemas bien documentados con ciertos escenarios genéricos, podría decirse que una matriz simple es muy útil y pragmática en un límite de servicio web. En el contexto del blog de Eric, en este caso, no se trata de la cuestión de la persona que llama / llamada, ya que existe una barrera forzada entre los dos.

En términos de WSDL / mex, sospecho que los 3 (lista / colección / matriz) se convertirán en un bloque de elementos, por lo que puede ir con lo que sea más conveniente.

Otros consejos

Normalmente devuelvo IList < T > desde un servicio web de WCF: FxCop está bastante contento con esto. No estoy seguro si esto funciona con los servicios web ASMX.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top