Prism 4 Documentation:http://compositewpf.codeplex.com/releases/view/55580

  这一章解决了建立和运行一个Prism应用需要做的事情。一个Prism程序需要在应用快速启动的过程中进行注册和配置,这就是众所周知的bootstrapping 应用。

  什么是一个Bootstrapper?

  一个bootstrapper是一个类,它会用Prism类库来承担已建立的应用程序的初始化。通过运用bootstrapper,你将更好的控制怎样将Prism类库的组件连接到你的应用中。

   Prism类库包含了一个默认的抽象的Bootstrapper基类,这些基类可以通过任一容器对其具体化的方式来使用。在bootstrapper类上的需多方法是虚拟方法。你可以重写这些方法,让这些方法成为适合你自己习惯的bootstrapper安装启用。

  bootstrapper过程的基础近阶

  Prism类库提供了一些附加的基类,这些基类从Bootstrapper中得到,有适合于大部分应用的默认安装。唯一剩余的需要你的应用bootstrapper来实现的阶段是创建和初始化shell。

  Dependency Injection

  通过Prism类库建立起来的应用依赖于由容器提供的dependency injection。类库提供的程序集于Unity或是MEF一起工作,它也允许你使用其他的dependency injection 容器。部分bootstrapper过程需要配置容器和为容器注册类型。

  Prism库包含了UnityBootstrapper和MefBootstrapper类,这就能够实现使用Unity或是MEF作为应用中dependency injection容器大部分需要的功能。除了前面例子中所展示的领域外,每一个bootstrapper在它们的容器中添加了一些具体的步骤。

  创建shell

  在传统的WPF应用中,App.xaml文件中一个URI启动是指定的,用来登陆主窗口。在Silverlight应用中,应用中的RootVisual属性是在App.xaml文件后面的代码中设定的。

  在一个用Prism库创建的应用中,创建shell或是主窗口是由bootstrapper来完成的。这是应为shell依赖于服务,像Region Manager,只有当它注册以后shell才能显示。

  关键的决定

  你决定了在你的应用中使用Prism库之后,还需要做很多其他的决定:

  • 你将需要决定你是否使用MEF,Unity或是为dependency injection 容器使用其他的容器。这将决定你使用哪个类来提供bootstrapper,你是否需要为其他的容器创建一个bootstrapper。
  • 你需要思考在你的应用中要什么特定的应用服务。这些需要在容器中进行注册。
  • 决定固有的登陆服务是否适合你的需要或者你需要创建另一个登陆服务。
  • 决定你的应用怎样发掘模块:是通过明确的代码声明,通过目录浏览发现在模块中的代码属性,部署或是XAML.

剩下的章节提供更多的细节。

核心脚本

  创建一个快速启动序列式你建立你的Prism应用重要的一部分。这一节叙述如何创建一个bootstrapper并定制它来创建一个shell,配置dependency injection 容器,注册应用的水平服务和如何加载并初始化模块。

为你的应用创建一个bootstrapper

  如果你选择使用Unity或是MEF作为你的dependency injection 容器,为你的应用创建一个简单的bootstrapper是很容易的。你需要从MefBootstrapper或是UnityBootstrapper中创建一个新的类。然后,实施CreatShell这个方法。你也可以选择为特定初始化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在待显示状态。实现InitializeShell的方法取决于你是用WPF还是Silverlight写的应用,这两者是不同的。对于Silverlight应用来说,你需要设置shell作为应用的可视化根基,像如下所示:

c#
protected override void InitializeShell()
{Application.Current.RootVisual = Shell;
}

  对于WPF应用,你将创建shell应用对象并将它设置为应用的主窗口,像如下所示(来自WPF模块的快速入门)

1 c#
2 protected override void InitializeShell()
3 {
4     Application.Current.MainWindow = Shell;
5     Application.Current.MainWindow.Show();
6 }

  InitializeShell方法的基础实现不需要做什么。不调用基类实现是安全的。

创建和配置组件目录

  如果你建立一个组件应用,你将需要创建和配置一个组件目录。Prism用一个具体的IModuleCatalog实例来阐释了对于应用来说什么样的组件式有效的,哪种组件可能需要下载下来试用,以及组件存放在哪里。

  引导程序提供了一个受保护的ModuleCatalog属性来引用目录和一个可视化CreateModuleCatalog方法的基本实现。这个基本实现返回一个新的ModuleCatalog;然而,可以重写这种方法以用来提供一个不同的IModuleCatalog实例取代它自身,就像下面的代码显示的那样,这些代码来自Silverlight快速入门中MEF模块QuickStartBootstrapper。

1 c#
2 protected override IModuleCatalog CreatModuleCatalog()
3 {
4     //当使用MEF时,已存在的Prism模块目录是静态的
5    //通过配置文件来配置模块
6     return ModuleCatalog.CreatFormXaml(new Uri("/ModelarityWithMef.Silverlight;component/ModulesCatalog.xaml",UriKind.Relative));
7 }

在UnityBootstrapper和MefBootstrapper类中,Run方法调用CreateModuleCatalog方法然后用返回值的方式设这类的ModuleCatalog属性。如果你要重写这个方法,不需要调用基础类的安装启动,因为你将会代替已经提供了的功能。更多关于模块化的信息参照第四章,“模块应用开发。”

创建和配置容器

  在用Prism库创建的应用中,容器起了一个关键的作用。Prism库和创建在它顶部的应用都依赖于一个注入了需要的依赖和服务的容器。在容器配置阶段,需要注册几个核心的服务。除了这些核心服务外,你可能需要具体应用服务,这些服务由于跟组成相关提供了附加的功能。

核心服务

下面的表格列出了在Prism库中具体不适用的核心服务。

服务接口

描述

IModuleManager 为将要检索的服务定义了接口并初始化了应用的模块。
IModuleCatalog 包含了在应用中关于模块的元数据。Prism库提供了几个不同的目录。
IModuleInitialize 初始化模块。
IRegionManager 为在布局中的可视化容器注册和检索区域。
IEventAggregator 在出版者和捐赠者之间的低耦合事件的收集。
ILoggerFacade

一个登陆机制的封装,你可以选择你自己的登陆机制。Stock  Trader RI通过EnterpriseLibraryLoggerAdapter类使用企业类库登陆应用区域,这个可以作为一个例子来说明你怎样使用你自己的记录器。记录服务已经用容器进行了注册,它是通过bootstrapper的Run方法,使用CreateLogger方法的有效返回值来实现的。用这个容器来注册其他的记录器将不再生效;反而在bootstrapper上重写了CreateLogger方法。

IServiceLocator 允许Prism库使用容器。这可能对定制或是扩展类库起作用。

具体应用服务

下面的表格列出了使用在Stock Trader RI中的具体应用服务。这个可以当做一个了解你的应用中可能提供的服务的类型的例子来使用。

Stock Trader RI中的服务

描述

IMarketFeedService 提供模拟的实时交易数据。PositionSummaryPresentationModel根据它从这个服务接收到的通告来跟心屏幕位置。
IMarketHistoryService 提供历史交易数据用来展示所选基金的趋势走向。
IAccountPositionService 技工文件夹中的基金列表
IOrderService 持续提交买/卖命令
INewsFeedService 为所选的基金提供一个新闻列表。
IWatchListService 当新的密切关注的项目被添加到观看列表时进行操作。

 在Prism中有两个衍生Bootstrapper类可用,UnityBootstrapper和MefBootstrapper。创建和配置不同的容器涉及到实施起来不同但却相同的概念。

在UnityBootstrapper中创建和配置容器

   UnityBootstrapper类的CreateContainer方法很容易的可以创建和返回一个新的UnityContainer实例。在大部分情况中,你不需要改变这个功能;然而,方法是有效的,从而具有灵活性。

  在创建了容器之后,它可能需要为你的应用进行配置。ConfigureContainer在UnityBootstrapper中的安装被默认的注册了许多核心Prism服务,如下所示。

Note:

这是一个当一个模块在它的Initialize方法中注册模块级服务时的例子。

c# UnityBootstrapper.cs
protected virtual void ConfigureContainer(){...if ( useDefaultConfiguration){RegisterTypeIfMissing( typeof( IServiceLocator),typeof ( UnityServiceLocatorAdapter), ture);RegisterTypeIfMissing( typeof( IModuleInitializer), typeof(ModuleInitializer), ture);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方法决定了一个服务是否被注册,它将不会被二次注册。你就可以通过配置来重写默认的注册。你也可以关闭默认注册服务;如果你这样做,用传入false参数加载Bootstrapper.Run 方法。你也可以重写ConfigureContainer方法禁用你不想使用的服务,像事件聚合器。

Note:

如果你关闭了默认注册,你需要手动注册需要的服务。

  要扩展默认的ConfigureContainer方法,只需要简单的添加一个方法重写到你应用的引导程序中,随意调用基本的安装启用,如下面的代码所示,这些代码是Modularity for WPF(with Unity)QuickStart中的QuickStartBootstrapper。这个实现调用了基类的安装启用,注册了ModuleTracker类型作为IModuleTracker的具体实施,并且注册了callbackLogger作为一个Unity的CallbackLogger的单例模式。

1 C#
2 protected override void ConfigureContainer()
3 {
4     base.ConfigureContainer();
5     this.RegisterTypeIfMissing(typeof(IModuleTracker),typeof(ModuleTracker),ture);
6     this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);
7 }

在MefBootstrapper中创建和配置容器

MefBootstrapper类的CreateContainer方法做了如下几件事情。第一,它创建了一个AssemblyCatalog和一个CatalogExportProvider。CatalogExportProvider允许MefExtensions程序集为许多Prism类型提供默认的主配置文件,也允许你重写默认类型的注册。其次,CreateContainer使用CatalogExportProvider创建并返回了一个新的CompositionContainer实例。在大部分情况中,你不需要改变这个功能;然而,这个方法是虚拟的,因此允许灵活使用。

Note:

   在Silverlight中,由于受安全性限制,不能用一个类型来取回一个集合。Prism使用了Assembly.GetCallingAssembly方法来取代。

  容器创建了之后,需要对你的应用进行配置。MefBootstrapper中的ConfigureContainer的实现默认的注册了许多核心Prism服务,像如下的代码所示。如果你重写这个方法,要考虑清楚你是否应该调用基类的实现来注册核心的Prism服务,你是否需要在你的应用实现中提供这些服务。

C#
protected virtual void ConfigureContainer()
{this.RegisterBootstrapperProvidedTypes();
}
protected virtual void RegisterBootstrapperProviderTypes()
{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的核心服务作为单例添加到了容器中,因此它们可以在整个应用的过程中通过容器进行定位。

  MefBootstrapper除了提供CreateContainer和ConfigureContainer方法外,通过使用MEF也提供两个方法来创建和配置AggregateCatalog。CreateAggregateCatalog方法很容易的创建和返回一个AggregateCatalog对象。像MefBootstrapper中的其他方法一样,CreateAggregateCatalog是虚拟的,如果需要的话可以重写它。

  ConfigureAggregateCatalog方法允许命令式的将类型注册添加到AggregateCatalog中。例如,Modularity with MEF for Silverlight QuickStart中的QuickStartBootstrapper明确将ModuleA和ModuleC添加到了AggregateCatalog中,如下所示:

C#
protected override void ConfigureAggregateCatalog()
{base.ConfigureAggregateCatalog();//将这个集合添加到ModuleTracker出口中this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));//...this.AggregateCatalog.Catalogs.Add(new.AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));//...this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleA.ModuleC).Assembly));
}

更多信息

  关于MEF的更多信息,AggregateCatalog和AssemblyCatalog,参见MSDN上的“Managed Extensibility Framework Overview”http://msdn.microsoft.com/en-us/library/dd460648.aspx .

转载于:https://www.cnblogs.com/blancpure/archive/2012/07/03/2574378.html

prism4.0——chapter 2:初始化Prism应用相关推荐

  1. WPF PRISM开发入门一( 初始化PRISM WPF程序)

    原文:WPF PRISM开发入门一( 初始化PRISM WPF程序) 这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在G ...

  2. 为什么权重初始化要非对称?为什么权重初始化不能全为0?为什么初始化值不能太大或者太小?介绍下He初始化以及Xavier初始化?

    为什么权重初始化要非对称?为什么权重初始化不能全为0?为什么初始化值不能太大或者太小?介绍下He初始化以及Xavier初始化? 目录

  3. 微软免费图书《Introducing Microsoft LINQ》翻译Chapter2.1:C# 3.0 特性(对象初始化表达式\匿名类型\查询表达式)...

    本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理. 允许转载,但转载时请注明本版权声明信息,禁止用于商业用途! 博客园:韩现龙 Introducin ...

  4. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  5. Professional C# 6 and .NET Core 1.0 - Chapter 43 WebHooks and SignalR

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - Chapter 43 WebHooks ...

  6. Ant Desing Pro2.0(一)项目初始化

    1.写在前面 最近做毕设的时候发现网络上关于ant designpro2.0版本的基础入门资料太少,我一个后端开发人员当时入门也是跌跌撞撞,现在我将我所学的分享出来,避免大家少走一些弯路. 2.开发环 ...

  7. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC

    What's In This Chapter? Features of ASP.NET MVC 6 Routing Creating Controllers Creating Views Valida ...

  8. windows10 mysql-8.0.20 重新初始化

    windows10 mysql8.0.20 重新初始化 1 首先进入windows--服务,停止mysql服务,要不然删除不了后续的Data文件夹. 2 进入mysql安装目录将原来mysql配置的D ...

  9. Android 9.0 SIM卡初始化流程

    转载:https://blog.csdn.net/linyongan/article/details/51406123 本文主要讲述Android 9.0 SIM卡初始化流程,这个过程也涉及到UICC ...

最新文章

  1. Go语言学习之旅01--变量与数据
  2. eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能
  3. Win10系统删除文件需提供管理员权限-- 解决方案
  4. SQL 注入工具集合
  5. 开源播放器 Banshee 发布 1.0 beta 2
  6. 为什么跨境电商独立站将成为几年的焦点?
  7. python输出文本对齐_python-使用PIL使文本居中对齐/居中对齐?
  8. RDD与DataFrame
  9. jntoo.php,小舍微信分销拼团系统V6.0三级分销系统最新版源码+支持多商户入驻+拼团+微商城+分销...
  10. Neo4j下载安装教程
  11. Diamond软件的使用--(1)软件安装及配置
  12. Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
  13. python行与行之间必须对齐_Python中列名及其对应行的对齐
  14. 苯酚吸附专用树脂 污水中的苯酚怎么去除
  15. java 真少林倚天屠龙夺艳记,2019年9月13日資訊重點:月夜吟詠詩意長安十九屆中央第四輪巡視全部進駐...
  16. Pyhton 兔子繁衍问题(后有递归求法)(设有一对新生的兔子从第4个月开始他们每个月月初都生一对新兔子, 新生的兔子从第4个月开始又每个月月初生一对兔子,求n个月后兔子的总对数)
  17. 阿里云物联网平台最完全的使用教程
  18. win11蓝牙无法使用 Windows11蓝牙无法使用的解决方法
  19. 组合导航(一):定位技术分类与介绍
  20. 32位驱动安装到64位操作系统时出错

热门文章

  1. shell脚本编程学习之路-shell数组
  2. 钉钉内部视频遭曝光:疯子无招“逼疯”产品经理
  3. Docker容器固定IP分配
  4. IOS Masonry自动布局
  5. ORA-25153: Temporary Tablespace is Empty
  6. cront 的应用(摘自鸟哥的私房菜)
  7. 重新理解 Monad
  8. 在配置文件(.settings、.config)中存储自定义对象
  9. Webpack 源码学习系列(一)
  10. python(40):利用utf-8编码判断中文英文字符