这一篇主要用来介绍一下基于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框架研究(三)的更多相关文章

  1. Prism框架研究(一)

    从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...

  2. Prism框架研究(二)

    首先在介绍本节内容之前,首先来看看官方文档来如何描述Prism 应用的初始化吧!A Prism application requires registration and configuration ...

  3. 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...

  4. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  5. 在Prism 框架中,实现主程序与模块间 UI 的通信

    背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...

  6. ASP.NET Web API 框架研究 ASP.NET Web API 路由

    ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...

  7. Prism框架的Module(模块化)编程

    Prism框架用的是新版本的,Prism7.1.关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html 如何告诉Shell(我们的宿主 ...

  8. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  9. JavaScript框架设计(三) push兼容性和选择器上下文

    JavaScript框架设计(三) push兼容性和选择器上下文 博主很久没有更博了. 在上一篇 JavaScript框架设计(二) 中实现了最基本的选择器,getId,getTag和getClass ...

随机推荐

  1. hive并行执行作业; 强化在脑海的印象

    如果集群资源充足可以设置:set hive.exec.parallel=true; (默认是false) 这样相互独立的job可以并行执行!!!! count(distinct) 最好改写为group ...

  2. mybatis error

    2018-08-02 14:01:18.021 WARN org.apache.catalina.loader.WebappClassLoaderBase Line:179 - The web app ...

  3. Topshelf:一款非常好用的 Windows 服务开发框架 转发https://www.cnblogs.com/happyframework/p/3601995.html

    背景 多数系统都会涉及到“后台服务”的开发,一般是为了调度一些自动执行的任务或从队列中消费一些消息,开发 windows service 有一点不爽的是:调试麻烦,当然你还需要知道 windows s ...

  4. from __future__ import包的作用

    __future__是python2的概念,其实是为了使用python2时能够去调用一些在python3中实现的特性 1.absolute_import from __future__ import ...

  5. MySql 建表出现的问题:[ERR] 1064 - You have an error in your SQL syntax; check the manual.......

    使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 建表语句: DROP DATABASE IF EXISTS javawe ...

  6. ASP.NET 管道

    序号 名称 说明 1 BeginRequest ASP.NET开始处理的第一个时间,表示处理的开始 2 AuthenticateRequest 验证请求,一般用来取得请求的用户信息 3 PostAut ...

  7. Java多线程(一)多线程基础

    一.进程 进程是操作系统结构的基础:是一次程序的执行:是一个程序及其数据在处理机上顺序执行时所发生的活动.操作系统中,几乎所有运行中的任务对应一条进程(Process).一个程序进入内存运行,即变成一 ...

  8. 【转】MySQL中的共享锁与排他锁

    在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使用方式及 ...

  9. Ueditor使用以及遇到的问题

    原来用的是Kindeditor这个编辑器,但很久没更新了,最新版是13年更新的.现在要换成百度的Ueditor, 在这里记录Ueditor的使用流程和遇到的问题. 一.下载 1.Ueditor官网 这 ...

  10. disruptor 高性能之道

    disruptor是一个高性能的线程间异步通信的框架,即在同一个JVM进程中的多线程间消息传递.应用disruptor知名项目有如下的一些:Storm, Camel, Log4j2,还有目前的美团点评 ...