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 ...
随机推荐
- 基于BeautifulSoup库的HTML内容的查找
一.BeautifulSoup库提供了一个检索的参数: <>.find_all(name,attrs,recursive,string,**kwargs),它返回一个列表类型,存储查找的结 ...
- windows下python2和python3共享
其实最好的解决方案使用 virtualenv http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html 不太好的方法,先安装 ...
- Vim 中使用 vimim 来输入中文
Vim 中输入中文,要来回切换中英文,偶尔不慎的切换和按键,可能导致误删不能恢复的错误,一直是个很头疼的问题.现在有了 vimim 这个插件,整个世界清净了. 插件官方网站:http://www.vi ...
- 【转】从零开始玩转logback
概述 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)下载地址:http://l ...
- 深蓝词库转换2.2发布,支持手心输入法和Win10微软拼音
距离上一次大版本的发布已经很久很久了,中间是不是会收到一些用户的来信,提出新的需求,于是只是做小版本的更新,终于积累了一些更新后,打算做个大版本的发布了. 深蓝词库转换是一个输入法的词库互转和生成软件 ...
- RPC通信原理(未完,先睡觉)
一 背景 OpenStack 各组件之间是通过 REST 接口进行相互通信,比如Nova.Cinder.Neutron.Glance直间的通信都是通过keystone获取目标的endpoint,即ap ...
- 安装kubelet报错 : Depends: init-system-helpers (>= 1.18~) but 1.14ubuntu1 is to be installed
解决办法: wget http://launchpadlibrarian.net/173841617/init-system-helpers_1.18_all.deb dpkg -i init-sys ...
- CF960G Bandit Blues 第一类斯特林数、NTT、分治/倍增
传送门 弱化版:FJOI2016 建筑师 由上面一题得到我们需要求的是\(\begin{bmatrix} N - 1 \\ A + B - 2 \end{bmatrix} \times \binom ...
- IDEA+Maven+Tomcat构建项目流程
0.准备 本文主要解决在IDEA上开发Maven-webapp项目关联Tomcat的问题. 首先,确保本地计算机下载解压了Tomcat压缩包,以及配置好了Java环境. 1.新建Mavne项目 2.I ...
- Java之文本文件的创建和读取(含IO流操作)
工具类:对文件的读取,创建.直接复制拿来用! package cn.zyzpp.util; import java.io.BufferedReader; import java.io.Buffered ...