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
来解决它 - 在您实际使用它之前它不会得到解决。只要在模块初始化后使用它就可以了。
我刚开始使用 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
来解决它 - 在您实际使用它之前它不会得到解决。只要在模块初始化后使用它就可以了。