【发布时间】:2013-08-05 23:40:56
【问题描述】:
我可能做错了,但我认为我走在正确的道路上。我是第一次构建 WPF 应用程序,但我仍然习惯了一些事情的完成方式。
我的想法
- 我的目标是让我的 ViewModel 类更易于测试。
- ViewModel 依赖于服务类,没有它就无法正常工作。
- 因此,将服务注入 ViewModel 对我来说似乎很有意义,这样我也可以开始模拟它以进行测试。
我做了什么
- 对我的视图模型(称为“UploaderViewModel”)进行了 XAML 引用:
<Window.DataContext> <viewModels:UploaderViewModel> </viewModels:UploaderViewModel> </Window.DataContext>
注意:在我尝试进行注射之前,这可以正常工作
- 在我的 app.xaml.cs 文件中设置结构映射:
void App_Startup(object sender, StartupEventArgs eventArgs) { ContainerBootstrapper.BootstrapStructureMap(); ProcessStartupArguments(eventArgs); }
调用我的引导程序类:
public static class ContainerBootstrapper
{
public static void BootstrapStructureMap()
{
ObjectFactory.Initialize(
x => x.For<IVEDocumentService>().Use<VEDocumentService>()
);
}
}
-
然后我让我的 UploaderViewModel 类将 IVEDocumentService 作为构造函数参数:
public UploaderViewModel(IVEDocumentService documentService) { _documentService = documentService; //other unrelated code below this }
出了什么问题
我收到一个 XAML 错误,指出没有为 ViewModel 找到默认构造函数,这是有道理的,因为我没有 UploaderViewModel(),只有 UploaderViewModel(IVEDocumentService documentService)。
问题
- 解决此问题的最佳方法是什么?
- 我应该创建一个 UploaderViewModel() 构造函数并使用服务实例让 StructureMap 调用 UploaderViewModel,还是有更好的方法?
更新 1 -- 尝试使用资源字典,StructureMap 错误。
基于这个SO Answer to a similar question,我尝试了:
- 更新我的 App_Startup 以将 UploaderViewModel 的实例添加到资源字典:
void App_Startup(object sender, StartupEventArgs eventArgs) { ContainerBootstrapper.BootstrapStructureMap(); var uploaderViewModel = new UploaderViewModel(new Container().GetInstance<IVEDocumentService>()); Current.Resources["UploaderViewModel"] = uploaderViewModel; ProcessStartupArguments(eventArgs); }
- 将
DataContext="{StaticResource UploaderViewModel}"添加到我的<Window>声明中 - 注释掉我的
<viewModels:UploaderViewModel/>声明
执行此操作后,StructureMap 现在会抛出错误:
"StructureMap 异常代码:202No Default Instance defined for 插件家族
【问题讨论】:
-
202 错误表明 StructureMap 无法解析请求的类型或其依赖项之一。如果您查看完整错误或内部异常,您应该能够看到 StructureMap 不知道如何构造的类型。
VEDocumentService是否在构造函数中注入了任何依赖项? -
VEDocumentService实际上根本没有构造函数。它目前仅包含一种公共方法。错误消息的内部异常为空。
标签: c# wpf xaml dependency-injection structuremap