Prism 文档 第二章 初始化Prism应用程序
第二章 初始化Prism应用程序
本章将讨论为了使一个Prism应用程序的启动和运行哪些是必须的。Prism的应用程序在启动过程中需要注册和配置,这被称为引导应用程序。
什么是Bootstrapper?
bootstrapper是一个类,通过Prism类库负责一个应用程序建立的初始化。通过使用bootstrapper,对于如何将Prism库组件连接到您的应用程序,你会有更多的控制。
Prism类库包括一个默认的抽象bootstrapper基类,可以专门用于任何容器。许多关于bootstrapper类的方法都是虚拟方法。您可以重写这些方法,使其适合执行您自己自定义的bootstrapper。
Basic stages of the bootstrapping process

Prism库提供了一些额外的基类,派生于Bootstrapper,,具有默认的实现,适合大多数应用程序。对于你程序的Bootstrapper,留给你唯一要做的就是创建和初始化Shell。
依赖注入
用Prism构建的应用程序依赖于容器提供的依赖注入。本库提供工作在Unity(Unity Application Block)或MEF(Managed Extensibility Framework)两种框架下的容器,它允许你使用其他依赖注入容器。启动引导过程的一部分就是配置此容器并向容器注册类型。
Prism库包括Unitybootstrapper和Mefbootstrapper两个类,它实现了大部分的功能,这些功能对于使用Unity或MEF作为你的应用程序中的依赖注入容器是必需的。除了在上图中所示的启动过程,每个引导程序还会增加一些特定于容器的步骤。
创建Shell
在传统的Windows Presentation Foundation(WPF)的应用程序中,启动程序的URL是在app.xaml文件中定义的。在Silverlight应用程序中,是由app.xaml代码中的RootVisual属性所指定的。
在用Prism库创建的应用程序中,Bootstrapper的责任就是创建Shell或主窗口。这是因为壳依赖一些服务,如Region Manager,需要在Shell被显示前进行注册。
关键决策
当你决定在你的应用程序中使用Prism后,还有一些额外需要作出的决定:
- 对于你的依赖注入容器,你需要决定是否使用MEF,Unity,或其他容器。这将确定你应该使用谁提供的bootstrapper类和你是否需要为另一个容器创建一个bootstrapper。
- 你应该考虑在你的应用程序中的一些特定应用服务,这将需要在容器中注册。
- 确定是否内置日志记录服务来满足您的需要或如果有必要,创建另一个日志记录服务。
- 确定模块将怎样被应用程序发现:通过显式代码声明,通过目录扫描模块代码属性,配置,或XAML…
在余下的章节中会提供更多详细参考
核心方案
创建一个启动序列是建立你的Prism应用的一个重要部分。本节介绍了如何创建一个引导程序和自定义它去创建Shell,配置依赖注入容器,注册应用程序级的服务,以及如何加载和初始化模块。
为你的应用创建一个启动程序(Bootstrapper)
如果你选择使用Unity或MEF作为你的依赖注入容器,那么为你的应用创建一个简单的引导程序是很容易的。你需要创建一个新的派生类,无论派生于MefBootstrapper或UnityBootstrapper。然后,执行CreateShell方法。或者,你可以为Shell的特定初始化重写Initializeshell方法。
实现CreateShell方法
该Createshell方法允许开发人员为Prism应用程序指定一个的顶层窗口。Shell通常就是主窗口或主页。通过返回应用程序的Shell类来实现这个方法。在一个Prism的应用程序中,您可以创建Shell对象,或从容器中指定,这取决于你应用程序的需要。
在下面的代码示例中通过使用Servicelocator指定Shell对象。
1 protected override DependencyObject CreateShell()
2 {
3 return ServiceLocator.Current.GetInstance<Shell>();
4 }
Note:你会经常看到Servicelocator被用来实例化而不是特定的依赖注入容器。该Servicelocator是通过调用容器实现,对于容器与其他代码解耦这是一个很好的选择。你也可以直接参考与使用容器而不是Servicelocator。
实现InitializeShell方法
你创建Shell后,您可能需要运行初始化步骤以确保Shell可以显示。这取决于你正在写一个WPF还是Silverlight应用,实现的Initializeshell方法会有所不同。对于Silverlight应用,你将Shell作为应用程序的Visual Root,如下所示。
protected override void InitializeShell()
{
Application.Current.RootVisual = Shell;
}
对于WPF应用程序,您将创建的Shell应用程序对象,并将它设置为应用程序的主窗口,如图所示(来自the Modularity QuickStarts for WPF)。
protected override void InitializeShell()
{
Application.Current.MainWindow = Shell;
Application.Current.MainWindow.Show();
}
对Initializeshell的基本实现不做任何事情。对此才是安全的。
创建和配置模块列表
如果你正在创建一个模块应用程序,你需要创建和配置模块列表。Prism采用IModulecatalog的实例来跟踪哪些模块对应用程序是可用的,哪些模块可能需要下载,以及放在哪。
Bootstrapper提供了一个Modulecatalog受保护的属性来表示该目录以及虚Createmodulecatalog方法的基实现。在基类的实现中返回一个新的Modulecatalog;然而,可以重写该方法提供一个不同的IModulecatalog实例,如下代码,这是在Modularity wiyh MEF for Silverlight QuickStart代码中的Quickstartbootstrapper。

protected override IModuleCatalog CreateModuleCatalog()
{
// When using MEF, the existing Prism ModuleCatalog is still
// the place to configure modules via configuration files.
return ModuleCatalog.CreateFromXaml(new Uri(
"/ModularityWithMef.Silverlight;component/ModulesCatalog.xaml",
UriKind.Relative));
}

在这Unitybootstrapper和Mefbootstrapper两个类中,Run方法调用Createmodulecatalog方法,然后用返回的值设置类的Modulecatalog属性。如果你重写此方法,调用基类的实现是没有必要的,因为你那将会取代提供的功能。有关模块的更多信息,请参见第4章,“模块化应用的发展。”
创建和配置容器
容器在Prism库创建的应用程序中发挥关键作用。无论是Prism库还是用它来建立的应用程序都依赖一个用于属性和服务注入的容器。在容器配置阶段,一些核心服务被注册。除了这些核心服务,由于涉及到组织,你可能需要一些特定应用服务来提供额外的功能。
核心服务
下列表格列出了在Prism库中的核心非应用的特定服务
|
服务接口 |
描述 |
|
IModuleManager |
定义了用于服务的接口,用来检索和初始化应用程序模块。 |
|
IModuleCatalog |
包含在应用程序中有关模块的元数据。Prism库提供了几个不同的列表。 |
|
IModuleInitializer |
初始化模块 |
|
IRegionManager |
注册和回收Regions,这是布局的视觉容器。 |
|
IEventAggregator |
发布者和订阅者之间的一系列松耦合事件。 |
|
ILoggerFacade |
一个日志机制的封装,所以你可以选择你自己的日志机制。The Stock Trader Reference Implementation (Stock Trader RI) 通过EnterpriseLibraryLoggerAdapter类,使用Enterprise Library Logging Application Block,作为一个你如何使用你自己的日志例子。日志记录服务是通过引导程序的Run方法在容器中注册的,该方法利用由CreateLogger方法返回的值。在容器中注册另一个记录器将不会有作用;而是应该重写引导程序的CreateLogger方法。 |
|
IServiceLocator |
允许Prism库访问容器。如果你想自定义或扩展库,这可能是有用的。 |
应用特定服务
下列表格列出了被使用在Stock Trader RI中的应用特定服务,这个可以作为一个例子用来理解你的应用程序中可能提供的服务类型
|
在Stock Trader RI中的服务 |
描述 |
|
IMarketFeedService |
提供实时行情数据。PositionSummaryPresentationModel根据从服务接收而来的通知更新位置屏幕。 |
|
IMarketHistoryService |
提供市场历史数据,这些数据用于为所选基金显示趋势线。 |
|
IAccountPositionService |
在投资组合中提供资金的列表。 |
|
IOrdersService |
持续提交买/卖单。 |
|
INewsFeedService |
为选择的基金提供一种新闻项目列表。 |
|
IWatchListService |
当新的观察项目被添加到观察名单中时处理。 |
在Prism中有两个引导程序的派生类是有效的,Unitybootstrapper和Mefbootstrapper。创建和配置不同的容器,涉及类似的概念却有不同的实现。
创建和配置在UnityBootstrapper中的容器
UnityBootstrapper类的CreateContainer方法简单地创建并返回一个UnityContainer新的实例。在大多数情况下,您不需要更改此功能;然而,该方法是虚方法,从而具有灵活性。
当容器被创建之后,它可能需要配置你的应用程序。在UnityBootstrapper中的ConfigureContainer方法在默认情况下注册了一系列核心Prism服务,如下所示
Note:例子内容:当一个模块在它的初始化方法中注册了模块及服务
UnityBootstrapper.cs

protected virtual void ConfigureContainer()
{
...
if (useDefaultConfiguration)
{
RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true);
RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true);
RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true);
RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true);
RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);
RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);
RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);
RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);
}
}

引导程序的RegisterTypeifMissing方法确定服务是否已经被注册---不能被注册两次。通过配置,允许你重写默认注册。你也可以关闭默认注册任何服务;要做到这一点,使用重载Bootstrapper.Run方法传递false。你也可以覆盖ConfigureContainer方法和禁用你不想使用的服务,如事件聚合。
Note:如果你关闭默认注册,你必须手动注册必要的服务。
为了拓展ConfigureContainer的默认行为,只需将你的应用程序的bootstrapper重载并且有选择的调用基类实现,如下面来自QuickStartBootstrapper from the Modularity for WPF (with Unity) QuickStart.的代码所示。这个实现调用了基类的实现,注册ModuleTracker类型作为IModuleTracker的具体实现,并注册callbackLogger作为CallbackLogger的单一实例。

protected override void ConfigureContainer()
{
base.ConfigureContainer(); this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker), true);
this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);
}

创建和配置在MefBootstrapper中的容器
MefBootstrapper类的CreateContainer方法做了以下几件事。首先,它创建了一个AssemblyCatalog和CatalogExportProvider。CatalogExportProvider允许MefExtensions组件为一些Prism类型提供默认出口,还允许你重写默认类型注册。然后CreateContainer创建并返回一个使用CatalogExportProvider的CompositionContainer的新实例。在大多数情况下,您不需要更改此功能;然而,该方法是虚方法,从而有更多灵活性。
Note:在Silverlight,由于安全限制,回收使用一个类型的组件是不可能。然反,Prism使用另一种方法,就是使用Assembly.GetCallingAssembly方法。
在容器被创建之后,你需要为你的应用程序来配置它。在MefBootstrapper中的ConfigureContainer实现在默认情况下,注册了一系列核心Prism服务,如下面的代码示例所示。如果你重写此方法,仔细考虑你是否应该调用基类的实现去注册核心Prism服务,或者你在你的实现中提供这些服务。

protected virtual void ConfigureContainer()
{
this.RegisterBootstrapperProvidedTypes();
} protected virtual void RegisterBootstrapperProvidedTypes()
{
this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger);
this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog);
this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container));
this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog);
}

Note:在MefBootstrapper中,Prism的核心服务作为单例被添加到容器中,所以,他们可以通过容器被置于应用程序各处。
除了提供CreateContainer和ConfigureContainer方法,MefBootstrapper还提供了两种方法来创建和配置由MEF使用的AggregateCatalog。CreateAggregateCatalog方法简单的创建并返回一个AggregateCatalog对象。就像在MefBootstrapper中的其他方法,CreateAggregateCatalog是虚方法,如果必要的话,可以重写。
ConfigureAggregateCatalog方法允许你向AggregateCatalog命令式的添加类型注册。例如,来自 the Modularity with MEF for Silverlight QuickStart的QuickStartBootstrapper明确地向AggregateCatalog添加了ModuleA和ModuleC,如下所示。

protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
// Add this assembly to export ModuleTracker
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));
// Module A is referenced in in the project and directly in code.
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly)); // Module C is referenced in in the project and directly in code.
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));
}

Prism 文档 第二章 初始化Prism应用程序的更多相关文章
- FreeRTOS官方翻译文档——第二章 队列管理
2.1 概览基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序.这些独立的任务之间很可能会通过相互通信以提供有用的系统功能.FreeRTOS 中所有的通信与同步 ...
- Solidity 文档--第二章:安装 Solidity
安装Solidity 基于浏览器的Solidity 如果你只是想尝试一个使用Solidity的小合约,你不需要安装任何东西,只要访问基于浏览器的Solidity. 如果你想离线使用,你可以保存页面到本 ...
- ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档
原文:ASP.NET Web API Help Pages using Swagger 作者:Shayne Boyer 翻译:谢炀(kiler) 翻译:许登洋(Seay) 对于开发人员来说,构建一个消 ...
- Prism 文档 第三章 管理组件之间的依赖关系
第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ...
- ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...
- ASP.NET Core 中文文档 第二章 指南(4.4)添加 Model
原文:Adding a model 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:许登洋(Seay).孟帅洋(书缘).姚阿勇(Mr.Yao).夏申斌 在这一节里,你将添加一些类来 ...
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- ASP.NET Core 中文文档 第二章 指南(4.2)添加 Controller
原文:Adding a controller 翻译:娄宇(Lyrics) 校对:刘怡(AlexLEWIS).何镇汐.夏申斌.孟帅洋(书缘) Model-View-Controller (MVC) 架构 ...
- ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB
原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...
随机推荐
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ [在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址 ...
- element-UI ,Table组件实现拖拽效果
拖拽效果,先放效果图,步骤放在后面~~ 一.引入三方插件 1.引入sortable.js的包: npm install sortable.js --save 2.或者npm i -S vuedragg ...
- python模块学习(三)
logging模块 简单应用 import logging logging.debug('debug message') logging.info('info message') logging ...
- 我的Android进阶之旅------>Android关于Activity管理的一个简单封装
用一个集合类对所有的Activity进行管理,实现随时控制Activity.用add(Activity activity)方法向List中添加Activity,用remove(Activity act ...
- Bridge Method
1.java编译器采用Bridge Method 来兼容本该使用泛型的地方使用了非泛型的问题. public class TestBridgeMethod { public static void m ...
- Linux安装配置
虚拟机配置Linux镜像文件 配置网路 防火墙 一.虚拟机配置Linux镜像文件 1.将下载好的Linux镜像文件载入进来 2.启动虚拟机,安装 3.此步为是否检测linux系统,我们选择" ...
- cn_office_professional_plus_2010_x86_515 安装激活方法解决方案64bit
一:首先选择 Office 2010 Toolkit.exe 右键 选择属性 –兼容性 然后 选择以管理员身份运行此程序 然后 双击 Office 2010 Toolkit.exe 需要安装的工具及 ...
- 剑指offer 面试50题
面试50题: 题目:第一个只出现一次的字符 题:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置. 解题思路一:利用Python特 ...
- PHP获取域名、IP地址的方法
本文介绍下,在php中,获取域名以及域名对应的IP地址的方法,有需要的朋友参考下. 在php中可以使用内置函数gethostbyname获取域名对应的IP地址,比如: 1 <?php 2 ech ...
- 安装好MySQL后就开始学习如何后台创建自己的数据库吧!
MySQL创建数据库的方式不像SQL Server那样有图形界面,而是使用DOS窗口创建的,接下来就是创建MySQL数据库的具体步骤. ↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓ ↓↓↓↓ ...