Wpf Prism v2:寻求澄清模块为什么需要;在shell中注册视图类型;

Wpf Prism v2:寻求澄清模块为什么需要;在shell中注册视图类型;,wpf,silverlight,prism,Wpf,Silverlight,Prism,我正在通读他们所说的: 在初始化期间,模块使用 RegionManager在中查找区域 shell和将一个或多个视图添加到 这些区域或注册一个或多个 要在这些视图中创建的视图类型 地区 我知道视图是在引导程序中添加的,例如在GetModuleCatalog()方法中: 但是注册视图类型意味着什么呢?如果模块已经像上面的代码那样“添加视图”,为什么需要向shell“注册视图类型”?当您向区域注册类型时,每当显示区域时,该类型都会被重新设置 如果您找到一个区域,然后向其中添加视图,则不需要向该视图注

我正在通读他们所说的:

在初始化期间,模块使用 RegionManager在中查找区域 shell和将一个或多个视图添加到 这些区域或注册一个或多个 要在这些视图中创建的视图类型 地区

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


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

当您向区域注册类型时,每当显示区域时,该类型都会被重新设置


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

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

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


回到您的特定问题:文档所说的是,如果您使用区域显示视图,则可以向区域注册视图类型。无论何时显示区域,它都会使用Unity容器自动构建视图。

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

每次调用该模块初始值设定项类的initialize方法时,模块都会注册它自己的IoC映射以及模块工作所需的其他内容

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

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

类似这样的内容(基于RI代码样式)

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


因此,模块初始值设定项将通过定义unity在加载视图的区域管理器操作期间解析视图所需的映射来注册视图。

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

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

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
}

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

我认为在“AddModule”中,我们应该“添加一个模块”。相反,我们“添加一个模块类型”。在我使用模块的应用程序中,我们使用了AddModule等方法,实际上我们确实添加了模块本身。为什么我们要添加“模块类型”而不是模块本身?ModuleCatalog不包含模块,它包含关于模块的信息。我建议在继续使用ModuleCatalog之前先了解DI/IoC,因为在理解为什么不处理模块,而只处理模块类型之前,您需要了解这一点。
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));