Silverlight项目笔记4:初识Prism以及IoC
1.Prism
Prism是由微软Patterns & Practices团队开发的针对WPF和Silverlight的MVVM框架。
Prism的几个关键点:
(1)启动器类UnityBootstrapper
Silverlight程序入口处调用Bootstrapper.Run方法时,Prism会自动做一些初始化工作,包括读取模块信息表,创建模块类实例并初始化(还可以选择按需加载模式OnDemand),以及在CreatShell中指定整个程序的根视图。
(2)继承IModule接口,进行模块初始化工作。
构造函数中传入UnityContainer容器(使用了IoC容器Unity),即可获得容器对象,后面需要大量使用UnityContainer对象的Resolve方法来获取指定对象关联的对象,即直接使用容器对象container来获取实例或方法。
然后在Initialize中做一些模块相关的初始化工作,比如监听事件消息,当载入本模块时,界面需要做一些什么工作等等。
(3)UI管理RegionManager
之前在模块初始化时说到界面需要做一些初始化工作,使用Prism框架,可以很方便的进行UI控件的切换导航。
在模块初始化的时候将需要用到的页面进行注册,当需要加载的时候就可以直接将页面加载到指定的区域。
下图即是在模块初始化时注册了某一个页面“XXXMainView”,当监听到加载页面的事件时,就可以将其加载到之前设计好的页面区域“Page Region”。
(4)事件聚合服务EventAggregator
Prism提供了事件聚合服务EventAggregator,使用起来比委托事件更方便,注册事件,然后直接发布订阅即可,模块之间的通信中将大量用到。
2.IoC容器Unity
IoC即Inversion of Contro控制反转,将代码的控制权交由系统控制,比如对象的创建、方法的调用都交给Unity进行控制,Unity也是由微软patterns& practices团队用C#实现的轻量级、可扩展的依赖注入容器,这样做的好处是消除模块间的直接依赖,面向抽象即使面向接口编程,方便程序的扩展维护。
使用UnityContainer的容器对象,即图中的m_Container、container,将对象与对象之间的关系进行注册后(IDataService与XXXDataService),就可以在整个程序任意地方再通过容器对象解析出该注册对象,进而执行该注册对象的属性或方法,
这也是除了事件聚合服务EventAggregator外,模块之间进行通信的另一办法。
3.使用Prism及IoC的好处
(1) 功能模块化,将系统划分为多个独立模块,方便多人协同开发;
(2)有效减少程序大小,模块化开发方式加上IoC,面向接口编程,模块各司其职,使得模块重复引用类库情况大为减少,编译出来的程序更小,对于Silverlight这种富客户端,提高了加载速度。
(3)层次逻辑更加清晰,便于开发;
(4)模块之间低耦合,当模块没有更新时,可以unload,不需要重新编译,大幅减少编译时间。
(5)增强扩展维护性。
所以系统有一定复杂程度后,非Demo或原型系统时,采用Prism以及IoC会是一个很好的选择。
Silverlight项目笔记4:初识Prism以及IoC的更多相关文章
- Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件
最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...
- Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
1.层次布局 由于地图窗口和菜单栏都在一个父容器内,在浏览器缩小到一定程度点击地图弹出infoWindow时,会出现菜单栏遮挡infoWindow中间部分的现象,于是通过设置Canvas.ZIndex ...
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...
- Silverlight项目笔记5:Oracle归档模式引起的异常&&表格控件绑定按钮
1.Oracle归档模式产生日志文件引起数据库异常 连接数据库失败,提示监听错误,各种检查监听配置文件,删除再添加监听,无果. sqlplus下重启数据库数据库依然无果,期间碰到多个错误提示: ORA ...
- Silverlight项目笔记3:Silverlight RIA Services缓存引发的问题
问题描述:使用Silverlight的RIA Services进行数据库更新操作,重复提交时发现异常,SubmitOperation发生错误,提示实体类冲突,检查发现之前删除的数据竟然还存在(数据库 ...
- Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口
1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...
- Silverlight项目笔记2:.svc处理程序映射缺失导致的WCF RIA Services异常
在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务器返回了错误:NotFound,监听发现请求数据库的服务异常,访问相 ...
- ArcGIS API for Silverlight学习笔记
ArcGIS API for Silverlight学习笔记(一):为什么要用Silverlight API(转) 你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我都 ...
- 《BI项目笔记》——微软BI项目笔记连载
本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块: 准备工作: <BI项目笔记>基于雪 ...
随机推荐
- Windows7 x64 系统下安装 Nodejs 并在 WebStorm 9.0.1 下搭建编译 LESS 环境
1. 打开Nodejs官网http://www.nodejs.org/,点“DOWNLOADS”,点64-bit下载“node-v0.10.33-x64.msi”. 2. 下载好后,双击“node-v ...
- [python]pythonic的字典常用操作
注意:dct代表字典,key代表键值 1.判断字典中某个键是否存在 实现 dct.has_key(key) #False 更Pythonic方法 key in dct #False 2.获取字典中的值 ...
- log4j的一些问题
今天,在学习log4j的时候发现了一点问题,关于level的问题. log4j.rootLogger=error, console, file , fileerror log4j.logger.com ...
- 关于 getWriter() has already been called for this response 的错误解决办法
java.lang.IllegalStateException: getWriter() has already been called for this response 今天在做显示图片的时候,( ...
- 面向对象的Javascript(5):继承
在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScrip ...
- Weex中文文档
这里整理当前已译出的Weex中文文档,如需查阅完整Weex文档,请访问http://alibaba.github.io/weex/doc/ . 同时也欢迎大家参与Weex中文文档翻译 [Guide] ...
- 使用Windows PE的U盘安装win7
前年刚去公司的时候用PE装过好多系统,最近又装一台华硕的,碰到了一个问题,一起记录了下. 华硕X45,Bios已经改为U盘启动了,但就是进不去,因为知道可能还有个选磁盘启动项的键,找了半天原来按Esc ...
- TreeBuilder科学的树创建器
public static class TreeBuilder { public static List<dynamic> Build(IEnumerable<dynamic> ...
- RSA密钥——JAVA与C#的区别和联系
PS:好久没写博了,最近在考虑以后的事情,而且手上杂事也比较多,终于得空来写两篇. 首先感谢:http://www.codeproject.com/Articles/25487/Cryptogra ...
- 1. windows环境安装Node.js
1. 下载 地址: https://nodejs.org/en/ 2. 下载最新版本v6.1.0 Currrent