如何使用依赖注入在Master-Detail视图中创建ViewModel

时间:2011-08-25 18:17:14

标签: unit-testing mvvm dependency-injection tdd inversion-of-control

我正在为我的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。

1 个答案:

答案 0 :(得分:2)

在这里,我描述了我如何处理这种情况:http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html。这是关于MEF,但想法是一样的。

基本上,您可以拥有一个名为IViewModelFactory的单独服务,您可以使用该服务创建子视图模型。对于单元测试,您将能够模拟该服务。