Prism 框架解读之一系列
名词解释
1.什么是IOC
IOC是 Inversion of Control的缩写,多数书籍翻译成“控制反转”。
IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
2. Bootstrapper:
在程序中使用框架需要找到一个切入点,将框架植入进去,将一部分功能委托给框架来实现。在Silverlight中使用Prism的切入点就是App.xaml.cs中的Application_Startup方法。一般来说,这个方法中只是指定页面最先加载的页面,但是我们把默认的逻辑去掉,取而代之的是Bootstrapper。当调用Bootstrapper.Run方法时,它会完成一些准备工作,如一些配置等。因此你会发现,使用Prism后,启动程序时会比正常启动要慢一些,就是因为Bootstrapper做了许多工作。Prism默认提供了两个基于特定容器的Bootstrapper——UnityBootstrapper和MefBootstrapper,分别使用Unity和Mef来实现依赖注入。Bootstrapper详细介绍参见
3. Module:
Prism帮助我们把程序分解成一个个功能模块,这些功能模块就叫做Module,通常一个工程就是一个Module。由于Module彼此是独立的,但是在运行时需要将它们整合到一起,因此Prism需要知道Module的存在,这里就涉及到了ModuleCatalog。 Module是一些逻辑上相关的程序集或者资源文件的集合,在Silverlight程序中通常以xap文件为单位存在。而每一个Module中都需要有一个负责进行初始化工作以及与系统进行集成的角色,它需要实现IModule接口。IModule接口中只有一个Initialize方法,一方面这个接口将这个工程标记为一个Module,另一方面你可以在Initialize方法中实现一些逻辑,比如向容器中注册一些Service,或者将视图集成到程序中等等。
1) ModuleInfo
ModuleInfo就是对Module的抽象,包含Module的名字,类型,依赖等一些信息。在创建了一个Module之后,需要通知Prism这个Module的存在,也就是要注册一下。在Prism中,Module是以ModuleInfo的形式存在的。ModuleInfo记录了Module的信息,ModuleName属性是Module的标识符,相当于Module的ID;ModuleType是Module的AssemblyQualifiedName;DependsOn属性是该Module依赖的其它Module的ModuleName的集合,在加载该Module时,如果有依赖项没有加载的话,会先将依赖项加载;InitializationMode,有两种情况——WhenAvailable和OnDemand,当选择了WhenAvailable时,该Module会在程序启动时自动加载,如果选择了OnDemand,则会按需加载,默认情况下是WhenAvailable;Ref,存储该Module的位置,如XXX.xap;State,定义了Module从注册到加载到初始化的整个过程中的状态。
2) ModuleCatalog
ModuleCatalog就是Module的容器,里面包含了所有Module的信息,以ModuleInfo的形式存在。ModuleCatalog: ModuleCatalog实现了IModuleCatalog接口,它是ModuleInfo的容器,保存着系统中所有Module的信息,不仅会管理哪些Module需要加载,什么时候加载以什么顺序加载等问题,还要检查各个Module之间是否存在着循环依赖、是否有重复的Module等等。ModuleCatalog提供了含参构造方法和AddModule方法,可以通过代码将Module注册进去,同时也可以在xaml文件中配置好Module,然后通过ModuleCatalog.CreateFromXaml方法来加载。
3) ModuleManager
ModuleManager实现了IModuleManager接口。顾名思义就是管理Module的类。IModuleManager中含有两个方法和两个事件:Run方法会将所有InitializationMode为WhenAvailable的Module加载,然后进行初始化,初始化的工作委托给了IModuleInitializer来完成,它会获取到Module类(上面提到的实现了IModule接口的类)的实例,然后调用其Initialize方法。LoadModule方法用来加载InitializationMode为OnDemand的Module。两个事件分别用来通知下载Module的进度变化以及Module加载完成。
4. Region:
相当于ASP.Net中的ContentPlaceHolder(是这么叫的吧?),起到占位符的作用,如本例中Shell中有两个Region——RegionA和RegionB,定义了两块区域。在Module的初始化过程中,通过IRegionManager将Module中的页面放进了定义好的Region中。IRegionManager负责管理Region,可以通过它向Region中注册View,进行导航等。
开发者会负责创建Shell程序、托管应用程序以及限定的区域(Region)。 区域(Region)是可以从模块(Module)中载入动态内容的占位符(placeholder)。 模块应该以标准的MVC模式构建,其中有一个或多个视图、一个控制器和一个模型。
Prism框架提供了模块目录(Module Catalog)、模块管理器(Module Manager)和区域管理器(Region Manager)。 我们可以通过代码、XAML文件、配置文件或者遍历目录来生成模块的目录。 然后管理器会以即时或者按需的方式载入模块。 最后区域管理器(Region manager)会从模块中将视图载入到正确的区域中。
5. Container:
依赖注入容器。在程序中使用依赖注入的好处到处都可以找的到。在Silverlight中使用容器来管理各个组件的一个很明显的好处就是使用单例来降低内存使用。否则每次加载一个页面都需要重新创建一个也很耗费资源的。当然好处不只这些,通过容器来注入一些服务(如本例中的IRegionManager和ITextProvider)显得相当方便。
依赖注入容器用于解决组件间的依赖;解决依赖通常使容器知道其中的类型和实例,用于解决依赖性 (registration) ,并且获取这些引用依赖到一个消费类中 (resolution)。Prism类库支持Managed Extensibility Framework and (MEF) 、Unity Application Block (Unity) 容器、但它并不是一种特有的容器。 因为类库通过IServiceLocator 接口访问容器。容器可以被替换。要使用别的容器,只要实现IServiceLocator 接口并暴露你的容器API来注册和resolution。而且,如果你要更换容器,你必须实现你自己特定的bootstrapper。IServiceLocator 接口定义于 Common Service Locator 类库中。这是一个开源的成果,实现了 IoC (Inversion of Control) 抽象的容器,如依赖注入容器,和服务定位器。使用该类库的目的是协同IoC 和Service Locator。
Prism类库提供了MefServiceLocatorAdapter 和UnityServiceLocatorAdapter。MefBootstrapper 类和UnityBootstrapper 类注册了它们各自基于IServiceLocator实现,当需要依赖注入时会使用需要的容器,只要通过 Prism类库代码,就可以保证Prism类库和使用的容器解耦。
对自行开发的代码来说,你可以简单的基于你选择的容器的API进行代码开发。 你不必通过IServiceLocator 抽象,除非你想你的代码对容器不可知。比如,Prism 引用指南和参考实现演示了不基于MEF 和Unity 容器直接实现的API。
6. Shell:
相当于程序的入口,初始界面,还能够提供类似ASP.Net中的母版页的功能。Shell必须由Bootstrapper创建,因为Shell需要使用的一些service,比如RegionManager等,需要在Shell显示前注册。
7. 视图和视图模型Views and ViewModels
Views是包含外观窗体的 UI的组成部分。 你可以把它看作是呈现在客户端的用户控件。实际上,Prism 类库不必定义成用户控件。你可以使用数据模板来定义一个视图以呈现模型数据。view之间可以通过WPF的能力自由呈现界面。简单来说,View是UI元素的定义了UI呈现部分的集合,它提供了你UI上各独立部分的一种封装形式。
Model-View-ViewModel (MVVM) 模式已经 成为WPF/Silverlight展示模式中最常用的模式。使用MVVM模式时, 视图View与视图模型View model在运行时相联系并提供了数据和交互逻辑来支持视图View的展现。
EventAggregator. Components in a composite application often need to communicate with other components and services in the application in a loosely coupled way. To support this, Prism provides the EventAggregator component, which implements a pub-sub event mechanism, thereby allowing components to publish events and other components to subscribe to those events without either of them requiring a reference to the other. The EventAggregator is often used to allow components defined in different modules to communicate with each other.
8. EventAggregator
在综合系统中,组件经常需要与其它组件和服务的松散耦合的。Prism提供EventAggregator,,这实现一个pub-sub事件机制,从而允许组件publish事件和 其他组件订阅事件。EventAggregator常被用来允许组件的不同模块间相互沟通。
9. Navigation.
Navigation is defined as the process by which the application coordinates changes to its UI as a result of the user's interaction with the application or internal application state changes. Prism supports two styles of navigation:
state-based navigation, where the state of an existing view is updated to implement simple navigation scenarios,
and view-switching navigation, where new views are created and old views replaced within the application's UI. View-switching navigation uses a Uniform Resource Identifier (URI)–based navigation mechanism in conjunction with Prism regions to allow flexible navigation schemes to be implemented.
导航定义的过程,应用坐标调整UI由于用户的交互影响应用程序或国内的应用状态变化。Prism支持两种风格的导航: state-based导航,国家更新现有的观点来实现简单的导航系统方案,另一种是view-switching导航,在创造和新的Views 取代旧有Views在应用程序的UI。View-switching导航使用统一资源标识符(URI)-base导航机制 与Prism regions来构成 灵活的导航解决方案。
10. Multi-targeting
采用分离表现模式,如MVVM或MVP模式的时候,你可以分离从您的应用程序的 用户界面显示和 业务逻辑。View model,, presenter 及model ,可以重复使用的在WPF和Silverlight。 WPF-specific and Silverlight-specific views can then be defined in a way that encapsulates the UI for each.
Prism 框架解读之一系列的更多相关文章
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- 项目中使用Prism框架
Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且 ...
- [转]玩转Google开源C++单元测试框架Google Test系列
gtest的官方网站是: http://code.google.com/p/googletest/ 从官方的使用文档里,你几乎可以获得你想要的所有东西 http://code.google.com/p ...
- 转:玩转Google开源C++单元测试框架Google Test系列
转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...
- 玩转Google开源C++单元测试框架Google Test系列(转载)
越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...
- WPF Prism框架下基于MVVM模式的命令、绑定、事件
Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...
- 在Prism 框架中,实现主程序与模块间 UI 的通信
背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...
- Prism框架研究(一)
从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...
- Prism框架中加载类库中时其中第三方类dll提示无法加载程序集
Prism框架是采用一种依赖注入的方式动态加载程序集,能够在程序需要加载的时候将程序集注入到里面去,实现程序的热插拔效果,而且采用这种框架能够让我们进行一个大项目的独立开发,在最近的一个项目中在独立开 ...
随机推荐
- [转]API性能测试基本性能指标及要求
原文链接http://blog.csdn.net/strawbingo/article/details/46458959 指标的基本概念 1.事务(Transaction) 在web性能测试中,一个事 ...
- UITableView的全部属性、方法以及代理方法执行顺序,看过之后肯定有收获---董鑫
UITableView-------表视图--继承UIScrollView并遵守NSCoding协议 属性 frame-------------设置控件的位置和大小 backgroundColor-- ...
- shell脚本命令(sotr/unip/tr/cut/eval)与正则表达式
shell脚本命令(sotr/unip/tr/cut/eval)与正则表达式 1.sort命令 概述: Linux sort命令用于将文本文件内容加以排序. sort命令可针对文本文件的内容,以行为单 ...
- 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...
- 《PHP程序员面试笔试宝典》——如何回答系统设计题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 应届生在面试时,偶尔也会遇到一些系统设计题,而这些题目往往只是测试求职者的知识面,或者测试求职者对系统架构方面的了解,一 ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- .NET官方封装的Win32API类库
大部分朋友在使用C#.NET调用Win32API时都不清楚API函数的声明,要么就是抄网上的代码,但是总会遇到各种各样奇奇怪怪难以解决的问题,打算自己封装又发现工作量实在太大. 其实完全没有必要自己动 ...
- 第三章 in,not in 的理解,limit限制结果集
IN 运算符用来判断表达式的值是否位于给出的列表中:如果是,返回值为 1,否则返回值为 0.NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中:如果不是 ...
- 通过shell脚本进行linux服务器的CPU和内存压测
文章目录 内存压测 python的方式 shell的方式 cpu压测 在正常手段下,这个只是压测的方法 在不正常手段下(crontab计划任务),可以提高CPU和内存的使用率 什么?你问我为什么要提高 ...
- 上架打包错误:error itms-90086
这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置 然后发现没有问题 就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...