CollectionPropertiesShouldBeReadOnly di FxCop è incompatibile con il framework di primavera?

StackOverflow https://stackoverflow.com/questions/206746

  •  03-07-2019
  •  | 
  •  

Domanda

FxCop ha la CollectionPropertiesShouldBeReadOnly rule che si lamenta se la tua classe ha qualche tipo della proprietà di raccolta che i client possono impostare. Invece, suggerisce di rendere la proprietà di sola lettura e di fornire un metodo Clear () e metodi Add () o AddRange () per modificare il contenuto della raccolta.

Sono d'accordo che rende l'interfaccia più pulita e controllata, ma sto lottando per far funzionare quell'interfaccia con il framework Spring. Se voglio configurare un oggetto con una raccolta di collaboratori, devo esporre alcune proprietà della raccolta per iniettare i collaboratori. Ho consultato la documentazione di primavera e posso vedo un modo per dire a Spring di chiamare il metodo AddRange (), mi sto perdendo qualcosa?

Per ora, escluderò l'avviso con una nota che è necessario per la configurazione di Spring.

Aggiornamento: dato che non ho ricevuto stuzzichini qui negli ultimi due mesi, ho pubblicato la stessa domanda sul Forum FxCop .

È stato utile?

Soluzione

Se la proprietà collection ha solo un getter esposto, assumeremo che i pattern consigliati da FxCop che elenchi vengano utilizzati e aggiunti alla collezione. È supportato anche il primo modello.

Per le raccolte generiche funziona solo se la proprietà esposta è di tipo IList. Abbiamo un problema JIRA per la prossima versione per risolvere questo problema. A proposito, questo è un modello molto comune nelle librerie di classi di base (come probabilmente saprai ...) che è dove abbiamo incontrato per la prima volta la necessità di supportare questo stile in .NET 1.1 (che non soffre delle limitazioni sopra elencate) .

Saluti, Mark

Altri suggerimenti

Il problema è grave come pensi? La mia comprensione è che FxCop si lamenterà se si dispone di una proprietà di lettura / scrittura come questa:

public List<Foo> Items { get; set; }

... perché gli utenti della tua classe sarebbero quindi in grado di farlo:

myInstance.Items = new List<Foo>();

Ovviamente non vuoi che gli utenti della tua classe riassegnino completamente l'elenco. FxCop raccomanda quindi questo modello:

private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }

Quindi ora gli utenti della tua classe possono solo aggiungere e rimuovere elementi dal tuo elenco, anziché sovrascriverlo con una nuova istanza di Elenco.

In che modo Spring.NET implementa le sue proprietà di raccolta? Stanno davvero leggendo / scrivendo come il mio primo esempio? Se è così, sarebbe interessante vedere i loro casi d'uso per un tale schema, perché non sembra giusto.

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