我正在为我的MVVM使用Jounce构建一个Silverlight应用程序。我有一个CustomerListViewModel(复数),它有一个CustomerViewModel对象的集合(单个)。
我正在使用Ninject进行依赖注入,因为我的ViewModel将依赖于其他类(即存储库,服务等)。
使用依赖注入相当容易,但现在我有点卡住了。加载CustomerListViewModel时,它将转到数据库(它已经通过DI拥有其存储库)并获取Customer对象。这些应该传递给CustomerViewModel。
我将如何构建这些CustomerViewModel对象?我一直都知道服务定位器模式是一种反模式,所以这感觉不对:
private void GetCustomerss()
{
var customers = _customerRepository.GetAll();
IList<CustomerViewModel> customerViewModels = new List<CustomerViewModel>();
foreach (var customer in customers)
{
var customerViewModel = ObjectFactory.GetInstance<CustomerViewModel>();
customerViewModel.Model = customer;
customerViewModel.Add(customerViewModel);
}
Customers = new ObservableCollection<CustomerViewModel>(customerViewModels);
}
我怎么能避免这种反模式?还是真的没那么糟糕?
这也使我的单元测试变得更难,因为我可以将一个模拟ICustomerRepository注入CustomerListViewModel(在构造函数中),但ObjectFactory.GetInstance<CustomerViewModel>()
将按预期工作,并且还解决CustomerViewModel的底层依赖关系。这将失败,因为我没有为这些底层依赖项设置Ninject。
答案 0 :(得分:2)
在这里,我描述了我如何处理这种情况:http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html。这是关于MEF,但想法是一样的。
基本上,您可以拥有一个名为IViewModelFactory
的单独服务,您可以使用该服务创建子视图模型。对于单元测试,您将能够模拟该服务。