Я использую шаблон MVVM в нашем приложении WPF для обеспечения всестороннего модульного тестирования. Сам шаблон MVVM отлично работает, однако я пытаюсь адаптировать шаблон таким образом, чтобы я мог использовать поддержку данных времени разработки WPF.
Поскольку я использую Prism, экземпляры ViewModel обычно вводятся в конструктор представления, например
public MyView(MyViewModel viewModel)
{
DataContext = viewModel;
}
Зависимости для ViewModel затем вводятся в конструктор, например
public class MyViewModel
{
public MyViewModel(IFoo foo, IBar bar)
{
// ...
}
// Gets and sets the model represented in the view
public MyModel { get; set; }
// Read-only properties that the view data binds to
public ICollectionView Rows { get; }
public string Title { get; }
// Read-write properties are databound to the UI and are used to control logic
public string Filter { get; set; }
}
Это, как правило, очень хорошо работает, за исключением случаев, когда речь идет о данных проектирования - я хотел избежать компиляции классов специфичных для дизайна данных в мою выпущенную сборку, поэтому я решил использовать подход {d:DesignData}
вместо подхода {d:DesignInstance}
однако для того, чтобы это правильно работало, у моего ViewModel теперь должен быть конструктор без параметров. Кроме того, мне также часто нужно менять дополнительные свойства, чтобы иметь сеттеры или быть изменяемыми коллекциями, чтобы иметь возможность устанавливать эти свойства в XAML.
public class MyViewModel
{
public MyViewModel()
{
}
public MyViewModel(IFoo foo, IBar bar)
{
// ...
}
// Gets and sets the model represented in the view
public MyModel { get; set; }
// My read-only properties are no longer read-only
public ObservableCollection<Something> Rows { get; }
public string Title { get; set; }
public string Filter { get; set; }
}
Меня это беспокоит:
- У меня есть безпараметрический конструктор, который никогда не предназначен для вызова и не тестируется на устройства
- Существуют сеттеры для свойств, которые должен вызывать только сам объект ViewModel
- My ViewModel теперь представляет собой смешавшуюся смесь свойств, которая должна быть изменена в представлении, а те, которые не должны - это делает сложным рассказать с первого взгляда, какая часть кода отвечает за поддержание любого заданного свойства
- Настройка определенных свойств во время разработки (например, просмотр стиля в тексте
Filter
) может фактически вызвать логику ViewModel! (поэтому мой ViewModel также должен быть tollerant иначе обязательных зависимостей, отсутствующих во время разработки)
Есть ли лучший способ получить данные о времени разработки в приложении MVP MVF MVPM таким образом, чтобы это не нарушало мою ViewModel таким образом?
В качестве альтернативы я должен строить свой ViewModel по-разному, чтобы он имел более простые свойства с логикой, выделенной где-то в другом месте.