Prism框架研究(三)
这一篇主要用来介绍一下基于Prism Library中的核心服务以及如何配置Container,还有一个重要的部分是如何管理各个组件之间的依赖性,下面就这些内容来做一一的介绍。
1 Prism中的核心服务
IModuleManager:为能够检索和初始化应用程序的各个模块的服务定义接口。
IModuleCatalog:包含一个应用程序各个模块的元数据,这个Prism Libray几种不同的Catalog。
IModuleInitializer:初始化应用程序的各个模块。
IRegionManager:注册和检索regions(姑且理解成视图区域),这些对于整个布局来说都是可视化的容器。
IEventAggregator:它是一个事件的发布者和订阅者之间的松散耦合的一个事件的集合。
ILoggerFacade:它是一个记录机制的一个包装器,因此你可以选择你自己的记录机制,当容器使用Bootstrapper的Run方法的时候,这个记录服务就会被注册,并且使用container注册另外一个记录器(logger)是无效的。
IServiceLocator:允许你通过Prism Library来获取容器,如果你想定制或者扩展当前Prism Libray,这将是非常有用的。
2 创建和配置UnityBootstrapper中的Container
这个UnityBootstrapper类中提供了一个CreateContainer的方法,这个方法创建并且返回一个UnityContainer的实例,在大多数情况下,你不太需要去改变这些,这个CreateContainer()方法是一个虚方法,因此它是相当灵活的。
当这个容器被创建以后,就需要来配置你的应用程序了,这个ConfigureContainer()默认的注册了一系列的Prism services,我们来看看这个方法的默认实现。
protected virtual void ConfigureContainer()
{
...
if (useDefaultConfiguration)
{
RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true);
RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true);
RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true);
RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true);
RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);
RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);
RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);
RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);
}
}
这个Bootstrapper的RegisterTypeIfMissing方法来决定一个服务是否已经注册过,并且不会连续去注册,通过重载这个方法,你也可以关闭已经注册的服务,并且注册自己的服务,以下面的代码为例,解释如何来注册自己的服务。
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker),true);
this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);
}
下面我们就通过代码来分析ModuleTracker和IModuleTracker。
这个类和接口是我们自己定义的用于管理我们自己的类,首先来介绍IModuleTracker。
public interface IModuleTracker
{
void RecordModuleConstructed(string moduleName);
void RecordModuleDownloading(string moduleName, long bytesReceived, long totalBytesToReceive);
void RecordModuleInitialized(string moduleName);
void RecordModuleLoaded(string moduleName);
}
根据命名的含义,我们不难看出具体的每一个方法的含义,RecordModuleConstructed(string moduleName)用于记录当前的Module是通过构造函数来构造的,RecordModuleDownloading(string moduleName, long bytesReceived, long totalBytesToReceive)记录当前的Module是通过网络来下载的,RecordModuleInitialized (string moduleName)表示用来记录当前的Moudule已经经历过初始化阶段,另外RecordModuleLoaded(string moduleName)用来记录当前的Module已经加载完毕。ModuleTracker是继承自IModuleTracker的具体实现,这里代码太多就不一一说明,仅仅是一个提纲挈领的方式来讲述基本的概念和原理。
Prism框架研究(三)的更多相关文章
- Prism框架研究(一)
从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...
- Prism框架研究(二)
首先在介绍本节内容之前,首先来看看官方文档来如何描述Prism 应用的初始化吧!A Prism application requires registration and configuration ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- 在Prism 框架中,实现主程序与模块间 UI 的通信
背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- Prism框架的Module(模块化)编程
Prism框架用的是新版本的,Prism7.1.关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html 如何告诉Shell(我们的宿主 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- JavaScript框架设计(三) push兼容性和选择器上下文
JavaScript框架设计(三) push兼容性和选择器上下文 博主很久没有更博了. 在上一篇 JavaScript框架设计(二) 中实现了最基本的选择器,getId,getTag和getClass ...
随机推荐
- js 文件引用传递参数
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code (function() {var hm = document.createElement(&q ...
- Arduino 操作OLED
https://item.taobao.com/item.htm?_u=n1qf7bf5beef&id=562158712128 1.模块尺寸:35(L)*31(W)mm 2.电源电压:2.8 ...
- django如何语法高亮模块
首先,django的语法高亮必须配合markdown模块使用. 注意事项: 确保在渲染文本时添加了 markdown.extensions.codehilite 拓展 确保安装了 Pygments. ...
- PHP中静态变量和函数引用返回
这两天看看PHP写的框架CI,源代码中写了很多静态变量和函数引用. 官方文档地址:http://php.net/manual/zh/language.references.return.php 简单写 ...
- FineUIPro v3.6.0 发布了(3 年助力 200 家企业的信息化建设)!
FineUI(专业版)自从 2014-07-30 发布第一个版本以来,3 年来已经持续更新了 25 个版本,我们的坚持有目共睹,同时也受到了 200 家企业的青睐和信任,感谢一路有你. FineUI( ...
- zookeeper-操作与应用场景-《每日五分钟搞定大数据》
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- 给扔物线 HenCoder Plus 学员的一次分享文字版
半个月前,和我的终极技术目标扔物线朱凯一拍即合,到了他所开展的 HenCoder Plus 课程给大家分享了 1 个多小时的「模拟面试」心得,也顺便听了几次凯哥的课程,感觉真的挺用心的.自己也希望能一 ...
- 跨域访问-需要设置HTTP响应标头
前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加按钮弹出窗口 4.填入需要设置的信息 名 ...
- 第四次oo博客
论述测试与正确性论证的效果差异 单元测试利用测试者构造的测试用例来检查类或方法的正确性,一般来说所需要测试的用例是无穷多的,通过人为构造代表性的测试用例来尽量测试所有代码.测试的优点在于不易出错,只要 ...
- Python-类的封装
1:封装数据 将数据隐藏起来这不是目的.隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制. class Teacher: def __ ...