Prism v2:寻求澄清为什么模块需要“用shell注册视图类型”

时间:2009-03-05 09:20:03

标签: wpf silverlight prism

我正在阅读他们陈述的Prism v2 guidelines

  

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

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

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

但注册视图类型意味着什么?为什么模块需要与shell“注册视图类型”,如果它们已经像上面的代码那样“添加视图”了?

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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

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

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

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

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

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

答案 3 :(得分:0)

在上面的代码中,您将填写模块目录。这是Prism模块化工作的一部分。我有一个截屏视频来解释它here。基本上,你告诉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)。