【问题标题】:How does one provide dummy data using MVVM light at design time when ViewModels are using constructor injection?当 ViewModel 使用构造函数注入时,如何在设计时使用 MVVM light 提供虚拟数据?
【发布时间】:2013-09-19 12:55:40
【问题描述】:

我昨天遇到了一个奇怪的问题。我昨天使用 ninject 作为其 di 容器构建了一个临时的视图模型定位器样式系统。然后,我尝试让它解析数据存储库接口的最小起订量模拟实现,以通过构造函数注入输入视图模型。但是,我在设计时不断收到来自 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) 我应该如何添加设计时数据?

【问题讨论】:

    标签: c# mvvm ninject moq mvvm-light


    【解决方案1】:

    嗯,你有几个选择。 根据“IsInDesignMode”,您的视图模型中可能有不同的选项,并且您的设计数据驻留在那里。那将是您快速而肮脏的选择。

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

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

    MyData = DataService.GetData();
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 2013-04-05
      • 1970-01-01
      • 2015-04-04
      • 2021-12-23
      • 2017-04-08
      相关资源
      最近更新 更多