Wpf Prism shell 视图模型在模块之前解析

Wpf Prism shell view model resolved before module

我刚开始使用 Prism(使用 v8)和 WPF 应用程序。我已经创建了一个模块程序集并在应用程序中注册了它:

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    base.ConfigureModuleCatalog(moduleCatalog);
    moduleCatalog.AddModule<ApplicationModule>();
}

该模块注册了一个 MyApplication 的单例实例。

public class ApplicationModule : IModule
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterSingleton<IMyApplication, MyApplication>();
    }

    public void OnInitialized(IContainerProvider containerProvider)
    {
    }
}

ShellView 自动连接到 ShellViewModel。

public class ShellViewModel : BindableBase
{
    private readonly IDialogService? _dialogService;

    public ShellViewModel(IDialogService dialogService)
    {
        NewCommand = new DelegateCommand(NewExecute);

        _dialogService = dialogService;
    }

    public DelegateCommand NewCommand { get; private set; }

    private void NewExecute()
    {
        _dialogService?.Present("sample message", "sample caption");
    }
}

现在这一切都按原样工作,但是如果我将对 IMyApplication 的引用放入 ShellViewModel 构造函数中以便我可以引用它,整个事情就会崩溃,因为它还不存在而且它不能被注射。

所以我在 AddModule 调用和 ShellViewModel 构造函数上放置了一个断点,并且在调用 RegisterSingleton 之前调用了该构造函数,所以我猜我做错了什么。

我哪里做错了?

Where have I gone wrong?

你做得对。您发现了 Prism 中 module-system 的限制:shell 的视图模型不得依赖于模块中注册的任何内容。

虽然一开始这看起来很烦人,但它可以让您在后台加载模块时显示 shell。在大多数情况下,您可以通过将 Lazy<IServiceFromModule> 注入 ShellViewModel 而不是 IServiceFromModule 来解决它 - 在您实际使用它之前它不会得到解决。只要在模块初始化后使用它就可以了。