我在我们的 WPF 应用程序中使用 MVVM 模式来进行全面的单元测试。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 本身应该调用
- 我的 ViewModel 现在是应该由视图修改的属性和不应该修改的属性的混合体——这使得一眼就很难判断哪段代码负责维护任何给定的属性
- 在设计时设置某些属性(例如查看
Filter
文本样式)实际上最终会调用 ViewModel 逻辑!(所以我的 ViewModel 还需要容忍在设计时缺少其他强制依赖项)
有没有更好的方法在 WPF MVVM 应用程序中获取设计时数据,并且不会以这种方式损害我的 ViewModel?
或者,我是否应该以不同的方式构建我的 ViewModel,以便它具有更简单的属性,并将逻辑分离到其他地方。