Prism WPF AutoWireViewModel 异常

Posted

技术标签:

【中文标题】Prism WPF AutoWireViewModel 异常【英文标题】:Prism WPF AutoWireViewModel exception 【发布时间】:2021-05-04 13:43:01 【问题描述】:

我决定用 WPF 和 Prism 做一个重要的演示应用程序,以便在做的时候学到一些很酷的东西。一切都很顺利,直到我在 UI 层和数据服务层之间添加了一个业务逻辑层 (PartsAnalysis.Core)。出于某种原因,我得到了这个奇怪的 Prism.Mvvm.ViewModelLocator.AutoWireViewModel 异常:

    at http://System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
   at http://System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at http://System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   at http://System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at http://System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   at Footer.Views.Footer.InitializeComponent() in C:\Users\akahaei\source\repos\PartsAnalysis\FootersModule\Views\Footer.xaml:line 1
   at Footer.Views.Footer..ctor() in C:\Users\akahaei\source\repos\PartsAnalysis\FootersModule\Views\Footer.xaml.cs:line 12

在添加业务逻辑层之前,视图和视图模型连接良好。

这是 FooterView.xaml:

<UserControl x:Class="Footer.Views.FooterView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Footer.Views"
         xmlns:prism="http://prismlibrary.com/"
         prism:ViewModelLocator.AutoWireViewModel="True"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<StackPanel Orientation="Vertical">
    <!--<TextBlock Text="Binding Title" />-->
    <!--Todo: add localization-->
    <Button Command="Binding ImportDataCommand">IMPORT</Button>
</StackPanel>

通过实验,我注意到如果我从视图模型的构造函数中删除 IMeasurementAnalyser 测量分析器注入(属于业务逻辑层),我不会再遇到该异常:

public FooterViewModel(IMeasurementAnalyser measurementAnalyser, IEventAggregator eventAggregator)

     _measurementAnalyser = measurementAnalyser;
     _eventAggregator = eventAggregator;
     ImportDataCommand = new DelegateCommand(ImportData).ObservesCanExecute(() => CanImportExecute);
     SendMeasurementsCommand = new DelegateCommand(SendMeasurements);

这是它在 FooterModule 中的注册方式:

public class FooterModule : IModule

    private readonly IRegionManager _regionManager;

    public FooterModule(IRegionManager regionManager)
    
        _regionManager = regionManager;
    

    public void RegisterTypes(IContainerRegistry containerRegistry)
    
        containerRegistry.RegisterSingleton<IMeasurementAnalyser, MeasurementAnalyser>();
    

    public void OnInitialized(IContainerProvider containerProvider)
    
        _regionManager.RegisterViewWithRegion(RegionNames.FooterRegion, typeof(Views.Footer));
    

这是模块目录:

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    
        moduleCatalog.AddModule<PlotModule>();
        moduleCatalog.AddModule<FooterModule>();
        moduleCatalog.AddModule<CoreModule>();
        moduleCatalog.AddModule<DataAccessModule>();
    

我已经花了几个小时在上面,但我仍然不明白哪里出了问题。我也尝试过覆盖约定和我想到的任何东西,但没有。

注意:我在所有项目中都使用 .NET 5。

【问题讨论】:

我想,你忘了发Footer.xaml... 没有出现异常的代码,谁能调试? @Haukinger 我添加了 FooterView.xaml。如果我不使用业务逻辑层,它与视图模型的连接很好,所以我认为这就是问题所在。 【参考方案1】:

由于我的声誉,我无法发表评论,但MeasurementAnalyser 的构造函数中是否有可能发生异常或出现问题。 如果我尝试使用您的演示应用程序的大致设置在测试应用程序中复制您的问题,如果我在服务寄存器的构造函数中作为单例抛出异常,我将得到抛出的异常以及几乎相同的自动装配异常堆栈跟踪

【讨论】:

以上是关于Prism WPF AutoWireViewModel 异常的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism-Module?

从PRISM开始学WPFMVVM事件聚合器EventAggregator?

从PRISM开始学WPFMVVM事件聚合器EventAggregator?

Prism.WPF -- Prism框架使用(上)

WPF PRISM开发入门一