名词解释
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,或者将视图集成到程序中等等。
Module详细参见
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.