InitializeShell中使用Prism的模块依赖项

时间:2012-06-26 08:55:30

标签: prism unity-container

在我的Shell窗口中,我有一个工作空间区域,允许通过RequestNavigate进行视图切换。我正在使用带有View-First方法的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。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是使用模块依赖性

所以具有依赖关系的模块将包含

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

它所依赖的模块将包含:

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

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

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

答案 1 :(得分:1)

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

  1. CreateShell方法称为
  2. 调用InitializeShell方法
  3. 调用InitializeModules方法。

    protected override void InitializeModules()
    {
        base.InitializeModules();
    
        var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
        regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
    }
    
  4. 创建模块依赖项将不起作用,因为当您尝试导航到依赖于它们的视图时,甚至不会加载模块。另外我想指出你为什么使用服务定位器?当您在引导程序中工作时,可以直接访问容器。可以找到完整加载顺序here