我正在阅读 Prism v2 指南 他们在其中指出:

在初始化过程中,模块使用区域管理器在外壳中找到区域, 添加一个或多个视图 到这些地区或 注册一种或多种视图类型 在这些区域内创建

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

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

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

有帮助吗?

解决方案

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

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

回到你的具体问题:文档说的是,如果您使用 Regions 来显示视图,则可以向 Region 注册视图类型。每当显示 Region 时,它都会使用 Unity 容器自动构建 View。

其他提示

注册具有Region类型的类型时,只要显示该区域,就会实例化该类型。

如果您找到一个区域,然后向其添加视图,则无需在该视图中注册类型,因为您正在执行工作而不是让区域经理执行此操作。

在您的示例中,您正在向应用程序模块添加模块,我将其视为具有实现IModule接口(模块初始化程序类)的类的库的加载

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

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

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

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

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

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

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

当加载Module(通常是.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)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top