Является ли правило Collectionpropertieshouldbereadonly от FxCop несовместимым с spring Framework?
-
03-07-2019 - |
Вопрос
У FxCop есть Правило сбора свойств должно быть доступно только для чтения это вызывает недовольство, если у вашего класса есть какое-то свойство коллекции, которое могут установить клиенты.Вместо этого предлагается сделать свойство доступным только для чтения и предоставить метод Clear() и методы Add() или AddRange() для изменения содержимого коллекции.
Я согласен, что это делает интерфейс более чистым и контролируемым, но я изо всех сил пытаюсь заставить этот интерфейс работать с Spring Framework.Если я хочу настроить объект с коллекцией коллаборационистов, я должен предоставить некоторое свойство collection для внедрения коллаборационистов.Я просмотрел все весенняя документация, и я не вижу никакого способа сообщить Spring о вызове метода AddRange(), я что-то упускаю?
На данный момент я собираюсь исключить предупреждение с пометкой, что это необходимо для настройки Spring.
Обновить: поскольку за последние два месяца я не получал здесь никаких откусов, я разместил тот же вопрос на Форум FxCop.
Решение
Если в свойстве collection указан только метод получения, мы предположим, что используются перечисленные вами шаблоны, рекомендованные FxCop, и добавим их в коллекцию.Первый шаблон также поддерживается.
Для универсальных коллекций это работает только в том случае, если открытое свойство имеет тип IList.У нас есть Проблема с JIRA в следующем выпуске это будет исправлено.Кстати, это очень распространенный шаблон в библиотеках базовых классов (как вы, вероятно, знаете ...), именно там мы впервые столкнулись с необходимостью поддержки этого стиля в .NET 1.1 (который не страдает от ограничений, перечисленных выше).
Твое здоровье, Марк
Другие советы
Действительно ли проблема так серьезна, как вы думаете?Насколько я понимаю, FxCop будет жаловаться, если у вас есть такое свойство чтения / записи, как это:
public List<Foo> Items { get; set; }
...потому что тогда пользователи вашего класса смогли бы это сделать:
myInstance.Items = new List<Foo>();
Очевидно, вы не хотите, чтобы пользователи вашего класса полностью переназначали список.Поэтому FxCop рекомендует использовать этот шаблон:
private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }
Таким образом, теперь пользователи вашего класса могут только добавлять и удалять элементы из вашего списка, а не перезаписывать его новым экземпляром List .
Как Spring.NET реализует свои свойства коллекции?Действительно ли они читают / пишут, как в моем первом примере?Если это так, было бы интересно посмотреть их варианты использования такого шаблона, потому что это не кажется правильным.