我可能会把这一切都弄错了,但我以为自己是对的。我是第一次构建WPF应用程序,但仍然习惯于某些方法。
我的想法
我的目标是使ViewModel类更具可测试性。
ViewModel依赖于服务类,没有它就无法运行。
因此,将服务注入ViewModel对我来说似乎很有意义,这样我也可以为测试目的而对其进行模拟。
我做了什么
对我的视图模型进行了XAML引用,该视图模型称为“ UploaderViewModel”:
<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异常代码:202没有为以下对象定义默认实例
插件家族
最佳答案
我想到了。我认为我没有正确配置静态资源。使用StructureMap的解决方案是执行以下操作:
App.xaml.cs
void App_Startup(object sender, StartupEventArgs eventArgs)
{
ContainerBootstrapper.BootstrapStructureMap();
//Other logic
}
ContainerBootstrapper类
public static void BootstrapStructureMap()
{
ObjectFactory.Initialize(x => x.For<IVEDocumentService>().Use<VEDocumentService>());
}
MainWindow.xaml.cs
我将资源创建移到该类中:
public MainWindow()
{
var uploaderViewModel = new UploaderViewModel(ObjectFactory.GetInstance<IVEDocumentService>());
this.Resources["UploaderViewModel"] = uploaderViewModel;
InitializeComponent();
}
MainWindow.xaml
在
<Window>
定义上,我设置DataContext="{StaticResource UploaderViewModel}"
。奇迹般有效。我认为这是没有在适当范围内(窗口)绑定资源的组合。
关于c# - 如何使用StructureMap将服务注入(inject)到XAML引用的ViewModel中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18056895/