gpt4 book ai didi

c# - 如何使用 StructureMap 将服务注入(inject) XAML 引用的 ViewModel?

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:08 25 4
gpt4 key购买 nike

我可能做错了,但我认为我走在正确的道路上。我是第一次构建 WPF 应用程序,并且仍在习惯一些完成方式。

我的想法

  • 我的目标是让我的 ViewModel 类更易于测试。
  • ViewModel 依赖于服务类,没有它就无法运行。
  • 因此,将服务注入(inject) ViewModel 对我来说似乎很有意义,这样我也可以开始模拟它以进行测试。

我做了什么

  • 对我的 View 模型进行了 XAML 引用,称为“UploaderViewModel”:
 <Window.DataContext>
<viewModels:UploaderViewModel>
</viewModels:UploaderViewModel>
</Window.DataContext>

注意:这在我尝试进行注入(inject)之前效果很好

  • 在我的 app.xaml.cs 文件中设置结构图:
   void App_Startup(object sender, StartupEventArgs eventArgs)
{
ContainerBootstrapper.BootstrapStructureMap();
ProcessStartupArguments(eventArgs);
}

调用我的 Bootstrap 类:

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 Exception Code: 202No Default Instance defined for PluginFamily

最佳答案

我想通了。我想我没有正确配置静态资源。使用 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>());
}

主窗口.xaml.cs

我将资源创建移到了这个类中:

public MainWindow()
{
var uploaderViewModel = new UploaderViewModel(ObjectFactory.GetInstance<IVEDocumentService>());
this.Resources["UploaderViewModel"] = uploaderViewModel;
InitializeComponent();
}

主窗口.xaml

关于<Window>定义,我设置DataContext="{StaticResource UploaderViewModel}" .

像魅力一样工作。我认为这是未在适当范围(窗口)绑定(bind)资源的组合。

关于c# - 如何使用 StructureMap 将服务注入(inject) XAML 引用的 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18056895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com