FxCop ненавидит мое использование MVVM - PullRequest
3 голосов
/ 29 марта 2010

Я только начал работать с FxCop, чтобы увидеть, насколько плохо мой код работает с полным набором правил. Я начал с правил «Нарушение», и первым, с чем я столкнулся, был CA2227, который в основном говорит, что вы должны сделать установщик свойства коллекции доступным только для чтения, чтобы вы не могли случайно изменить данные коллекции.

Поскольку я использую MVVM, я обнаружил, что очень удобно использовать ObservableCollection со свойствами get / set, потому что он делает мои обновления GUI простыми и лаконичными в коде. Однако я также вижу, на что жалуется FxCop.

Другая ситуация, с которой я только что столкнулся, связана с WF, где мне нужно задавать параметры при создании рабочего процесса, и я не хотел бы писать класс-оболочку для коллекции, которую я использую, просто чтобы избежать этого конкретного сообщение об ошибке.

Например, вот пример сообщения об ошибке времени выполнения, которое я получаю, когда настраиваю свойства только для чтения:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff'

Что вы думаете по этому поводу? Я мог бы либо игнорировать эту конкретную ошибку, но это, вероятно, нехорошо, потому что я мог предположительно нарушить это правило в другом месте кода, где MVVM не применяется (например, код только модели). Я думаю Я мог бы также изменить его из свойства на класс с методами для управления базовой коллекцией, а затем вызвать необходимое уведомление от метода установки. Я немного запутался ... кто-нибудь может пролить свет на это?

1 Ответ

7 голосов
/ 29 марта 2010

Это конкретное правило говорит о том, что свойство коллекции должно быть доступно только для чтения, поскольку вам не нужно назначать целую коллекцию свойству.

Например, представьте себе класс, подобный этому:

public class Foo
{
   public ObservableCollection<int> Bar { get; set; }
}

Что произойдет, если где-то в коде у меня будет следующая строка:

var f = new Foo();
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 1, 2, 3, 4 });
// ...
// Attaches and handlers to the collection events
// ...
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 5, 6, 7, 8 });

Когда исполняются две последние строки кода, присоединенные обработчики событий не будут запускаться, поскольку свойство Bar имеет совершенно другой объект.

С другой стороны, если бы свойство было доступно только для чтения, события были бы запущены, и все было бы так, как ожидалось.

...