【翻译】Prism4:初始化Prism应用程序(上)

什么是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方法也没有关系。

时间: 2024-10-02 20:31:52

【翻译】Prism4:初始化Prism应用程序(上)的相关文章

centos-Java程序上传到CentOS的运行问题

问题描述 Java程序上传到CentOS的运行问题 用eclipse写好的Java程序(已编译,.class文件)上传到CentOS服务器上可以直接运行吗?CentOS服务器已配置Java环境,在CentOS中写Java程序编译后可以运行,但在本地可以执行的.class文件上传后却不能运行,提示Could not find or load main class XXX.请问是什么原因,CentOS上运行Java应如何处理? java环境配置在/etc/profile中,如下 如果是在CentOS

C#发现之旅:C#开发Windows Service程序(上)

Windows Service概念介绍 Windows Service,也称Windows服务,是32位Windows 操作系统中一种长期运行的后台程序.它们长期后台运行,没有用户界面,默默无闻,但它 们却是支持Windows正常运行的幕后英雄,却永无出头之日. Windows服务程序为其他 系统模块提供了非常重要的服务,而且各个Windows服务分工明确,比如IISAdmin服务提供 WEB内容的发布功能,若IISAdmin服务不启动,则静态HTML页面.ASP.ASP.NET或者 WebSe

vc++编程问题-谁能帮忙把这个VC++程序上运行的纵坐标改动一下啊,跪求,急用……

问题描述 谁能帮忙把这个VC++程序上运行的纵坐标改动一下啊,跪求,急用-- 把第一个纵坐标改成0-20,第二个改成0-500,现在不能改动,而且已改动两个都会同时变化,且图形并不随改动值的变化而变化,急用,跪求了--不胜感激-- void CScope::DrawAxis(CDC *pDC) { CFont *pOldFont; int i,nPosY; CString str; pOldFont = pDC->SelectObject(&m_FontAxis); pDC->SetT

代码-PageOffice从2.0升级到3.0在从程序上调试出现错误

问题描述 PageOffice从2.0升级到3.0在从程序上调试出现错误 再打开在线Office是提示:当前PageOffice需要获取跟高版本的授权才能正常运行Error :0x00005..如果是PageOffice 2.0 升级到PageOffice 3.0,还需要修改两处代码: (1)修改调用了PageOffice的页面的aspx文件中的代码"Version=2.0.0.1"修改为"Version=3.0.0.1",如下: <%@ Register A

求助,应用启动出现黑屏闪退,程序上、手机上或服务器上可能会有什么原因?

问题描述 求助,应用启动出现黑屏闪退,程序上.手机上或服务器上可能会有什么原因? 如题,应用启动出现黑屏闪退,程序上.手机上或服务器上可能会有什么原因?有遇到过的朋友么,求告知 解决方案 一般是你的客户端丢出了没有处理的异常造成的,也可能是你的程序使用了太多的内存.具体你要加上日志输出下.

怎么样调整窗体程序上listview行和行之间的间距啊?

问题描述 怎么样调整窗体程序上listview行和行之间的间距啊? 窗体程序中listview表格之间的间距怎么调整?怎么样调整窗体程序上listview行和行之间的间距啊? 解决方案 设置imagelist,通过设置图标大小,可以改变,再有就是可以自己重新绘制

ftp-java web做的网站上线,已经把域名解析到服务器IP上,把程序上传到FTP中,但是网站打不开

问题描述 java web做的网站上线,已经把域名解析到服务器IP上,把程序上传到FTP中,但是网站打不开 前几天也问过这个问题,但是问题依旧,下面是tomcat日志报的错,大神看看这是什么问题 2015-6-19 9:43:18 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting filter structs2 java.lang.UnsupportedClassVersionError: co

大家好!在C#编程中我点击MenuItem时想要获取被点击Item的Text,请问程序上要怎么实现,多谢!

问题描述 大家好!在C#编程中我点击MenuItem时想要获取被点击Item的Text,请问程序上要怎么实现,多谢! 解决方案 解决方案二:这个Item的Name属性.Text可以获取到privatevoidqToolStripMenuItem_Click(objectsender,EventArgse){stringid=this.qToolStripMenuItem.Text;} 解决方案三:((ToolStripMenuItem)sender).Text 解决方案四:第一楼楼主,我按照你的

【翻译】10个破坏程序的缓存错误

翻译自10 Program Busting Caching Mistakes 距Omar AI Zabir发表十个中断你应用程序的缓冲错误(Ten Caching Mistakes that Break your App)已经好几年了,它依然是一个关于缓存使用的建议的极好资源,尤其是使用本地内存中的缓存和使用分布式缓存的区别. 这里是10个错误.(总结): 依靠一个默认的串行器.默认的串行器会消耗大量CPU,特别是复杂类型.为你的语言和环境花点思维考虑最好的序列化和反序列化模式. 把大型对象存储