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的具体实现,这里代码太多就不一一说明,仅仅是一个提纲挈领的方式来讲述基本的概念和原理。
最新文章
- JavaSe:Properties文件格式
- caffe代码调试小结
- 【转载】new和malloc的区别
- C#反射的应用
- 矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
- 【转】DataSource高级应用
- 如何编写一个编译c#控制台应用程序的批处理程序
- AVCaptureDevice LED闪光灯控制
- C#下解决DrawImage画出来的Image变大了的问题
- [LeetCode] Search in Rotated Sorted Array [35]
- 浅谈C/C++引用和指针的联系和区别
- C# 鼠标事件弹框
- Spring Controller单元测试
- <;花儿与少年>;之一些很喜欢的台词收藏
- C语言中变量的存储方式
- Asp.Net Core使用SignalR进行服务间调用
- poj1988 Cube Stacking 带权并查集
- form 表单提交数据 不跳转解决办法
- Linux下C语言生成可执行文件的过程
- CUDA加opencv复现导向滤波算法