0

我正在阅读他们声明的Prism v2 指南:

在初始化期间,模块使用 RegionManager 来定位 shell 中的区域并向这些区域添加一个或多个视图,或者注册要在这些区域内创建的一个或多个视图类型

我知道视图是在引导程序中添加的,例如在 GetModuleCatalog() 方法中:

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog()
        .AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}

但是注册一个视图类型是什么意思呢?如果模块已经像上面的代码一样“添加视图”,为什么还需要向 shell “注册视图类型”?

4

4 回答 4

5

在您的代码中,您不是将视图添加到引导程序,而是将模块添加到 ModuleCatalog。CAB/Prism/Composite UI 世界中的模块可以包含视图,但很多时候它提供了其他模块可以使用的某种附加服务。例如,假设我有一个 Shell 恰好使用一些停靠管理器来显示视图。我希望模块使用 API IDockingWindowService 来显示/隐藏窗口。我希望服务实现易于互换,因此我创建了一个包含名为 DockingWindowService 的服务并实现 IDockingWindowService 的模块。我在 ModuleCatalog 中注册了这个模块。

复合框架工作流将创建此服务,将其注册到引导程序,并且在此之后加载的任何模块都将能够使用 IDockingWindowService。这个服务不是视图,而是逻辑;只是想指出这种区别。话虽如此,一个模块可以包含 0 个或多个视图(或者,作为简化,用户控件)。UI的单位是View。模块更像是一个逻辑和/或 UI 捆绑概念。

回到您的特定问题:文档所说的是,如果您使用区域来显示您的视图,您可以使用区域注册视图类型。每当显示区域时,它将使用 Unity 容器自动构建视图。

于 2009-03-05T14:28:43.807 回答
2

当您向区域注册类型时,只要显示该区域,该类型就会被实例化。

如果您找到一个区域,然后向其添加视图,则不需要向该视图注册类型,因为您正在做这项工作,而不是让区域经理来做。

于 2009-03-05T13:40:37.230 回答
0

在您的示例中,您正在将模块添加到应用程序模块中,我认为它是使用实现 IModule 接口的类(模块初始化程序类)加载库

每次调用该模块初始化程序类的 Intialize 方法时,模块都会注册它自己的 IoC 映射和模块工作所需的其他内容。

现在,模块可以在模块初始化期间加载视图(添加菜单项或工具栏项等)。这将涵盖您问题的“在模块初始化期间添加一个或多个视图”部分。

除了在初始化期间显示视图之外,模块通常包含更多视图,这些视图不会在模块加载时显示,而是通常用于响应某些事件(UserLoogingIn 事件可能需要显示登录视图)。为了让 Prism 显示该视图,视图和表示模型之间的所有映射必须已经在模块初始化程序中定义。

像这样的东西(基于 RI 代码风格)

this.container.Register(); this.container.Register();

因此,模块初始化程序将通过定义统一所需的映射来注册视图,以在加载视图的区域管理器操作期间解析视图。

于 2009-04-26T08:01:33.350 回答
0

在上面的代码中,您正在填写一个模块目录。这是 Prism 中模块化工作原理的一部分。我有一个截屏视频在这里解释它。本质上,您是在告诉 Prism 加载 .dll 或 .xap 文件。这些“模块”可以包含两件事:服务(考虑接口的实现)和视图。

加载模块(通常是 .dll 或 .xap 文件)时,会调用 Initialize 方法,您可以在其中注册服务和区域:

public class ModuleA : IModule
{
    IRegionManager _regionManager;
    IUnityContainer _container;

    public ModuleA(IRegionManager regionManager, IUnityContainer container)
    {
        _regionManager = regionManager;
        _container = container;
    }

    #region IModule Members

    public void Initialize()
    {
        _container.RegisterType<ICompanyService, CompanyService>();
        _regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));

    }

    #endregion
}

注意视图注册:

_regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));

您可以在 Initialize 中注册任意数量的视图。并且在任何模块的任何初始化中(同样,通常是 .xap 或 .dll)。

于 2009-06-07T14:38:47.107 回答