Il modo migliore di usare List < T > ed esponendo Collection < T >
-
10-07-2019 - |
Domanda
Devo implementare un servizio web che esponga un elenco di valori (numeri interi, classi personalizzate ecc.).
La mia soluzione di lavoro restituisce un Elenco < T >
, e secondo FxCop è meglio restituire un Collection < T >
o ReadOnlyCollection < T >
.
Se scelgo di restituire un ReadOnlyCollection < T >
, il servizio web mostra un errore come:
Per essere serializzabili in XML, i tipi che ereditano da
ICollection
devono avere un'implementazione diAdd (System.Int32)
a tutti i livelli della loro gerarchia di ereditarietà.System.Collections.ObjectModel.ReadOnlyCollection
1
[[System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] / code> non implementa
Aggiungi (System.Int32)
.
Qual è il tuo modo preferito di usare internamente un Elenco < T >
ed esporre un Collection < T >
? (usando C #, e preferibilmente solo framework 2.0)
Soluzione
Elenco < T > o Collezione < T > vanno bene in questo caso.
In termini della domanda originale, puoi racchiudere un Elenco < T > in una collezione < T > molto semplicemente:
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
Questo è un vero wrapper; aggiungi un elemento al wrapper (col) e viene aggiunto all'elenco. Questo può essere un po 'confuso, perché molti di questi costruttori usano l'argomento per fare la popolazione iniziale, ma non si collegano all'elenco originale. Collection < T > è un'eccezione ;-p
Dal momento che sei su un confine del servizio web, quella raccomandazione di FxCop non si applica. Questo è utile (in linea con Recenti Eric Lippert blog ) per evitare che un chiamante calpesti la memoria della chiamata, ma in uno scenario distribuito di servizi Web che semplicemente non si applica. Infatti, poiché i servizi Web presentano alcuni problemi ben documentati con determinati scenari generici, un semplice array è probabilmente molto utilizzabile e pragmatico a un confine del servizio web. Nel contesto del blog di Eric - in questo caso, non vi è alcuna questione del problema chiamante / chiamata, poiché esiste una barriera forzata tra i due.
In termini di WSDL / mex, sospetto che tutti e 3 (elenco / raccolta / matrice) diventeranno solo un blocco di elementi - quindi potresti andare bene con il più conveniente.
Altri suggerimenti
Di solito restituisco IList < T > da un servizio web WCF: FxCop è abbastanza contento di questo. Non sono sicuro che funzioni con i servizi Web ASMX.