La règle CollectionPropertiesShouldBeReadOnly de FxCop est-elle incompatible avec le framework Spring?

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

  •  03-07-2019
  •  | 
  •  

Question

FxCop a la règle CollectionPropertiesShouldBeReadOnly qui se plaint si votre classe a quelque chose de similaire. des propriétés de collection que les clients peuvent définir. Au lieu de cela, il suggère de rendre la propriété en lecture seule et de fournir une méthode Clear () et des méthodes Add () ou AddRange () pour modifier le contenu de la collection.

Je conviens que cela donne une interface plus propre et plus contrôlée, mais j'ai du mal à faire en sorte que cette interface fonctionne avec le framework Spring. Si je veux configurer un objet avec une collection de collaborateurs, je dois exposer une propriété de collection dans laquelle injecter les collaborateurs. J'ai consulté la documentation de Spring et je peux ne vois aucun moyen de dire à Spring d'appeler la méthode AddRange (), est-ce qu'il me manque quelque chose?

Pour l'instant, je vais exclure l'avertissement avec une note indiquant qu'il est nécessaire pour la configuration Spring.

Mise à jour : comme je n'ai rien reçu ici ces deux derniers mois, j'ai posté la même question sur la page Forum FxCop .

Était-ce utile?

La solution

Si la propriété de collection a uniquement un getter exposé, nous supposerons que les modèles recommandés par FxCop que vous répertoriez sont utilisés et ajoutés à la collection. Le premier motif est également supporté.

Pour les collections génériques, cela ne fonctionne que si la propriété exposée est du type IList. Nous avons un numéro JIRA pour résoudre ce problème. En passant, il s’agit d’un motif très courant dans les bibliothèques de classes de base (comme vous le savez probablement ...) et c’est là que nous avons été confrontés au besoin de prendre en charge ce style dans .NET 1.1 (qui ne souffre pas des limitations énumérées ci-dessus). .

Salut, Mark

Autres conseils

Le problème est-il aussi grave que vous le pensez? D'après ce que je comprends, FxCop se plaindra si vous avez une propriété de lecture / écriture comme celle-ci:

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

... car les utilisateurs de votre classe pourraient alors le faire:

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

Évidemment, vous ne voulez pas que les utilisateurs de votre classe réaffectent complètement la liste. FxCop recommande donc ce modèle:

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

Alors maintenant, les utilisateurs de votre classe ne peuvent que Ajouter et supprimer des éléments de votre liste, au lieu de l'écraser avec une nouvelle instance de Liste.

Comment Spring.NET implémente-t-il ses propriétés de collection? Sont-ils vraiment lire / écrire comme mon premier exemple? Si tel est le cas, il serait intéressant de voir leurs cas d'utilisation pour un tel modèle, car cela ne semble pas correct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top