什么是Bootstrapper(引导程序)
bootstrapper负责初始化使用Prism类库搭建的应用程序
使用bootstrapper,你可以更方便的控制Prism类库组件与你的应用程序之间的关系
Prism类库包含一个默认的抽象基类Bootstrapper
这个类型可以与任何容器一起使用
这个类型中的大多数方法都是虚方法
你可以在你的bootsrapper实现中重写这些方法
引导程序执行的基本步骤如下:
Prism类库提供了一些派生自Bootstrapper类的基类
使用这些基类可以完成绝大多数应用程序
继承实现bootsrapper,
你需要做的工作只是创建和初始化框架界面
依赖注入
使用Prism类库搭建的应用程序需要使用依赖注入容器
Prism支持Unity和MEF依赖注入容器
并且允许使用其他的依赖注入容器
引导程序的部分工作就是装配这个容器
并为容器注册类型
Prism类库包含UnityBootstrapper和MefBootstrapper类
这两个类实现了使用Unity或MEF所必须的功能
除了在前面的插图中展示的步骤
这两个类型还添加了针对各自容器的特殊步骤
创建框架
一般创建WPF应用程序,
APP.XAML中会指定一个启动画面的URI
在Silverlight应用程序中
APP.XAML的后端代码中指定了系统的RootVisual属性
使用Prism类库创建应用程序
bootstrapper负责创建框架画面
这主要是因为框架画面依赖于服务
这些服务类似与区域主管
这些服务在框架画面显示之前被注册
关键决定
当你决定使用Prism类库
还需要做出一些额外的决定:
必须决定是使用MEF、Unity还是其他的依赖注入容器
这决定你应该选择哪个bootstrapper类型
还是需要为你自己的依赖注入容器创建一个新的bootstrapper类型
你应该考虑你系统中的特殊服务单元,
这些需要注册到依赖注入容器内
判断是否系统内部集成的日志服务足够你使用了,
如果不够你要自己创建你自己的日志服务
决定系统如何发现模块
使用目录查找、配置文件、或者xaml来加载模块
(模块必须由明确的特性代码标记)
关键场景
指定有序的启动环节
对你创建Prism应用程序来说非常有用
这一小节主要描述怎样创建一个bootstrapper(引导程序)、
并定制这个引导程序以启动自己的框架画面、
配置依赖注入容器、
注册系统级别的服务、
怎样加载和初始化模块
为你的应用程序创建Bootstrapper
无论你是选择使用Unity还是MEF作为你的依赖注入容器
为你的应用程序创建一个简单的bootstrapper
都是非常容易的
你可以创建一个派生自MefBootstrapper或者UnityBootstrapper的类
然后重写CreateShell方法
有时候你还需要为了特殊的业务需求而重写InitializeShell方法
实现CreateShell方法
CreateShell方法允许开发人员指定Prism应用程序的top-level(顶层)窗口
Shell通常是指主窗口或注页面
在这个方法的具体实现中返回一个Shell的实例
在Prism应用程序中
你可以创建一个Shell的实例
也可以从依赖注入容器中取出shell的对象
选择哪种办法,就看你的需求了。
使用ServiceLocator从依赖注入容器中取出
shell对象的示例代码如下:
protected override DependencyObject CreateShell() { return ServiceLocator.Current.GetInstance<Shell>(); }
你会经常使用ServiceLocator(而不是特殊的依赖注入容器)来解析一些类型的实例
ServiceLocator实现了调用依赖注入容器的逻辑
这样主要是为了应对依赖注入容器代码不容易控制的特性
你也可以通过直接引用类库来使用依赖注入容器
实现InitializeShell方法
当你创建了一个框架画面(shell)
你需要执行初始化的几个步骤来确定你的框架画面可以被正常显示
开发WPF和开发Silverlight应用程序
InitializeShell方法的实现方式也会不同
对于Silverlight应用程序来说
你需要把框架画面设置成系统的visual root
代码如下:
protected override void InitializeShell() { Application.Current.RootVisual = Shell; }
对于WPF应用程序
你必须先实例化shell类型
然后把这个实例设置成系统的主窗口
代码如下:
protected override void InitializeShell() { Application.Current.MainWindow = Shell; Application.Current.MainWindow.Show(); }
基类的InitializeShell方法什么也没有做,是个空方法
不调用基类的InitializeShell方法也没有关系。