我可能会把这一切都弄错了,但我以为自己是对的。我是第一次构建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/

10-13 07:02