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 di Add (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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top