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

本文关键字:MVVM 数据 虚拟 构造函数 ViewModel 注入 | 更新日期: 2023-09-27 18:31:53

我昨天遇到了一个奇怪的问题。我昨天使用 ninject 作为其 di 容器构建了一个临时的视图模型定位器样式系统。然后,我尝试让它解析数据存储库接口的 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);

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

我承认这不是最小起订量的使用方式,所以问题是......
1.)有没有办法解决这个问题?
2) 我应该如何添加设计时数据?

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

好吧,您有几种选择。根据"IsInDesignMode",您可以在视图模型中使用不同的选项,并将设计数据驻留在那里。这将是您快速而肮脏的选择。

更好的选择是有一个数据服务,和一个模拟的(或DesignDataService),在你的ViewModelLocator中,你将在"IsInDesignMode"中使用它。

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

MyData = DataService.GetData();
在真实数据服务中,

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

如果您有任何其他问题,或者需要更多示例代码,请告诉我。