InitializeShell with Prism 中的模块依赖关系



在我的 Shell 窗口中,我有一个工作区区域,允许通过 RequestNavize 切换视图。我正在使用带有视图优先方法的 Unity,以便视图初始化如下所示:

public partial class WelcomeView : UserControl
{
    public WelcomeView(WelcomeViewModel vm)
    {
        InitializeComponent();
        this.DataContext = vm;
    }
}

当应用程序加载时,我想导航到默认视图,以便我的 BootStrappers InitializeShell 如下所示:

protected override void InitializeShell()
{
    Application.Current.MainWindow = (Window)Shell;
    Application.Current.MainWindow.Show();
    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
    regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
}

现在,我的默认视图 WelcomeView 要求在构造函数中注入 WelcomeViewModel,反过来,WelcomeViewModel 需要在其构造函数中注入一些服务:

public class WelcomeViewModel : INotifyPropertyChanged
{
    public WelcomeViewModel(ISomeService someService)
    {
         // Use some service
         someService.SomeEventOccured += new Action(someService_SomeEventOccured);
    }
    ...
}

问题是当ISomeService由模块提供时,由于在调用InitializeShell时模块未初始化,因此无法构造WelcomeViewModel,反过来也无法构造WelcomeView。

正确的方法是什么?

正确的方法是使用模块依赖项

因此,具有依赖项的模块将包含

[ModuleDependency("SomeModule")] 
[ModuleDependency("SomeOtherModule")] 
public class MyModule : IModule { } 

它所依赖的模块将包含:

[Module(ModuleName = "SomeModule")] 
public class MyOtherModule: IModule 

不使用"魔术字符串"也是有意义的,就像我在这里所做的那样,而是在您的公共/基础结构项目中有一个静态类,其中包含所有模块的名称。

这将允许 prism 以正确的顺序加载模块,以便您的依赖项始终解析。

只需将您请求导航的部分移动到稍后即可。调用引导程序有一个特定的顺序并对其进行总结。

  1. 创建外壳方法称为
  2. 初始化外壳方法称为
  3. 调用 InitializeModules 方法。

    protected override void InitializeModules()
    {
        base.InitializeModules();
        var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
        regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
    }
    

创建模块依赖项将不起作用,因为当您尝试导航到依赖于它们的视图时,甚至不会加载模块。我还想指出您为什么使用服务定位器?当您可以直接访问容器时,因为您在引导程序中工作。满载订单可以在这里找到

最新更新