当ViewModels使用构造函数注入时,如何在设计时使用MVVM光提供虚拟数据?

时间:2013-09-19 12:55:40

标签: c# mvvm ninject moq mvvm-light

昨天我遇到了一个奇怪的问题。我昨天使用ninject作为其di容器构建了一个临时的viewmodel定位器样式系统。然后我尝试让它解决数据存储库接口的moq模拟实现,以通过构造函数注入提供给视图模型。但是,我在设计时不断从moq获得以下异常。

Error   2   Unable to cast object of type 'Castle.Proxies.IADEmployeeRepoProxy_1' to type 'MVVMSupport.TestHarness.Data.IADEmployeeRepo'.   D:\Users\kicksagnome\Desktop\MVVMSupport\MVVMSupport.TestHarness\App.xaml   16  13  MVVMSupport.TestHarness

Mock<IADEmployeeRepo> repo = new Mock<IADEmployeeRepo>();
repo.Setup<List<ADEmployee>>(r => r.GetAllEmployees())
    .Returns(new List<ADEmployee>() { new ADEmployee() { FirstName = "Ryan Butcher" } });

Bind<IADEmployeeRepo>().ToConstant(repo.Object); //Also tried Bind<IADEmployee>().ToMethod(context => repo.Object);

它在设计器的第一次加载时运行良好,并且每次更改设计数据时都会失败并重建解决方案。

我知道这不是moq的用法,所以问题是......
1.)有没有办法解决这个问题?
2)我应该如何添加设计时数据?

1 个答案:

答案 0 :(得分:1)

嗯,你有几种选择。 您可以在视图模型中使用不同的选项,具体取决于“IsInDesignMode”,并将您的设计数据驻留在那里。那将是你快速而肮脏的选择。

更好的选择是拥有DataService和Mock one(或DesignDataService),并且在ViewModelLocator中,您将在“IsInDesignMode”中使用它。

从那里,只需将您需要的任何内容添加到DataService的接口,此服务将在构建时注入到您的视图模型中,然后您可以简单地使用以下内容:

MyData = DataService.GetData();

在真实数据服务中,您将获取您的数据,在设计/模拟中,您可以根据自己的喜好假装,轻松显示您的设计数据。

如果您有任何其他问题,或者需要更多代码,请与我联系。