CollectionPropertiesShouldBeReadOnly di FxCop è incompatibile con il framework di primavera?
-
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 .
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.