Prism学习笔记(三):对Prism中模块化程序的理解。
这几天学习Prism,看了下帮组文档和程序。在Prism中专门讲解模块化程序开发的有俩个列子,一个是用Unity解耦实现Prism的依赖注入,另一个列子是用MEF解耦是实现Prism的依赖注入。
案例(一):ModularityWithUnity.Silverlight
开启应用程序
(1)App.xaml.cs中
{
//创建Shell实例,不需要设置RootVisual
QuickStartBootstrapper bootstrapper = new QuickStartBootstrapper();
bootstrapper.Run();
}
(2)QuickStartBootstrapper.cs
//最基本的实现,确保Shell被整合到容器中
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.RootVisual = (UIElement)this.Shell;
}
构建模块
这里以Module A 为例,构建Module A,主要实现IModule接口
(1)首先新建Silverlight项目ModuleA
(2)实现IModule接口
{
using System;
using Microsoft.Practices.Prism.Logging;
using Microsoft.Practices.Prism.Modularity;
using ModuleTracking;
/// <summary>
/// A module for the quickstart.
/// </summary>
public class ModuleA : IModule
{
private ILoggerFacade logger;
private IModuleTracker moduleTracker;
/// <summary>
/// Initializes a new instance of the <see cref="ModuleA"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="moduleTracker">The module tracker.</param>
public ModuleA(ILoggerFacade logger, IModuleTracker moduleTracker)
{
if (logger == null)
{
throw new ArgumentNullException("logger");
}
if (moduleTracker == null)
{
throw new ArgumentNullException("moduleTracker");
}
this.logger = logger;
this.moduleTracker = moduleTracker;
this.moduleTracker.RecordModuleConstructed(WellKnownModuleNames.ModuleA);
}
/// <summary>
/// Notifies the module that it has be initialized.
/// </summary>
public void Initialize()
{
this.logger.Log("ModuleA demonstrates logging during Initialize().", Category.Info, Priority.Medium);
this.moduleTracker.RecordModuleInitialized(WellKnownModuleNames.ModuleA);
}
}
}
注册模块
注册模块有以下3种方式:
(1)用代码注册模块
(2)用Xaml文件注册模块
(3)用配置文件注册模块(只针对WPF)
下面介绍了用代码注册模块和用xaml文件注册模块的再改案例中的实现。
一)用代码注册模块
protected override void ConfigureModuleCatalog()
{
// Module A
Type moduleAType = typeof(ModuleA.ModuleA);
this.ModuleCatalog.AddModule(new ModuleInfo(moduleAType.Name, moduleAType.AssemblyQualifiedName, WellKnownModuleNames.ModuleD));
//Module C
Type moduleCType = typeof(ModuleC.ModuleC);
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
//指定按需特性
InitializationMode = InitializationMode.OnDemand
});
}
二)用xaml文件注册模块:
在ModulesCatalog.xaml文件中
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">
<Modularity:ModuleInfoGroup Ref="ModuleB.xap" InitializationMode="WhenAvailable">
<Modularity:ModuleInfo ModuleName="ModuleB" ModuleType="ModuleB.ModuleB, ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleInfoGroup>
<Modularity:ModuleInfoGroup InitializationMode="OnDemand">
<Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE" ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
<Modularity:ModuleInfo.DependsOn>
<sys:String>ModuleE</sys:String>
</Modularity:ModuleInfo.DependsOn>
</Modularity:ModuleInfo>
</Modularity:ModuleInfoGroup>
<!-- Module info without a group -->
<Modularity:ModuleInfo Ref="ModuleD.xap" ModuleName="ModuleD" ModuleType="ModuleD.ModuleD, ModuleD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleCatalog>
在QuickStartBootstrapper.cs中还要加上这样一段代码
//IModuleCatalog实例用于跟踪哪些模块有效,哪些模块可能需要被下载,哪些模块已经存在
protected override IModuleCatalog CreateModuleCatalog()
{
// Module B, D, E and F
return Modularity.ModuleCatalog.CreateFromXaml(new Uri("/ModularityWithUnity.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative));
}
加载模块
(1)Shell响应UI通过调用ModuleManager.LoadModule ,这里以Module C为例说明。在Shell.xaml.cs中
//ModuleManager用的是异步事件模式
//加载ModuleC
private void ModuleC_RequestModuleLoad(object sender, EventArgs e)
{
this.moduleManager.LoadModule(WellKnownModuleNames.ModuleC);
}
(2)Shell被通知已下载进度,通过订阅ModuleManager.ModuleDownloadProgressChanged事件,在Shell.xaml.cs中
void ModuleManager_ModuleDownloadProgressChanged(object sender, ModuleDownloadProgressChangedEventArgs e)
{
this.moduleTracker.RecordModuleDownloading(e.ModuleInfo.ModuleName, e.BytesReceived, e.TotalBytesToReceive);
}
(3)Shell被通知模块已经下载完成并初始化完成,通过订阅ModuleManager.LoadModuleCompleted事件
//e.IsErrorHandled来只是模块是否加载成功
void ModuleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
this.moduleTracker.RecordModuleLoaded(e.ModuleInfo.ModuleName);
}
Prism学习笔记(三):对Prism中模块化程序的理解。相关推荐
- Box2d学习笔记三:box2d中几个重要的类
我们已经知道box2d中的唯一物种:刚体,然而仅仅一个刚体对象并不能完成相应的物理模拟.如果看过box2d的帮助文档就知道,b2Body中提供的函数和属性中,并没有我们需要的物理属性,可以回忆一下,我 ...
- 【RobotStudio学习笔记】(十)模块化程序
当程序比较复杂,或者程序内存在重复的部分时,模块化程序设计往往是比较可行的办法.在RobotStudio中可以通过在主程序中调用不同的例行程序,达到使代码逻辑清晰的目的. 将搬运工件的动作保存为例行程 ...
- 学习笔记三:GMM模型以及EM算法理解及代码实现
第三章 GMM模型以及EM算法 1.潜变量模型 使用潜变量解释观测变量的数学模型,称之为潜变量模型 潜变量模型将不完全数据(观测数据)的边缘分布转换成容易处理的完全数据(观测数据+潜变量)的联合分布. ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
- tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...
- Ethernet/IP 学习笔记三
Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- 吴恩达《机器学习》学习笔记三——多变量线性回归
吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...
- Python基础学习笔记三
Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...
最新文章
- 创建指向以下位置中的matlab脚本的符号链接_【分享吧】浅析软链接与硬链接
- JavaMail学习之一-邮件传输协议
- wordpress mysql 安装_wordpress 搭建安装教程 1 安装数据库、SQLyog
- SQL注入语法类型——报错注入
- Keepalived配置日志文件
- select下拉框赋值和取值
- 锁定弹出层(jquery语法)
- 浙江大学计算机科学与技术学院分数线,浙江大学录取分数线一般在多少 高考最低多少分能上浙大...
- Server Tomcat Server at localhost failed to start解决方案
- 购物车中 商品的选中状态之后的一些业务逻辑操作
- 基于8086CPU微处理器的汇编学习之JMP指令
- 关于DG32f103C8T6 不启动的问题-调试可以运行自启动不行
- python socket recvfrom 超时捕获_python-udp客户端超时机制
- 【预测模型】基于粒子群优化宽度学习实现预测matlab代码
- 安装新版的winetricks_winetricks中文修改版(wine模拟器)
- Windbg线上问题分析:生产环境应用高CPU问题分析
- 带小数的二进制转十进制(C代码)
- lt;祝我生日快乐gt; 的词曲写的真好..杰伦果然是我心中的偶像
- 浏览器解析渲染页面过程
- 操作系统笔试面试笔记总结
热门文章
- 通过View.post()获取View的宽高
- P2016 战略游戏
- 关于textarea包在div的自适应问题
- 跨域,json与jsonp格式
- Unity Game Starter Kit for Windows Store and Windows Phone Store games
- 解决J2EE系统应用性能问题常用方法
- 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
- recycleview 嵌套高度问题_简单解决RecyclerView嵌套的RecyclerView条目显示不全和宽度不能铺满...
- pythonprint()_python基础1 print()函数
- bat 域 本机管理员密码_Windows域中特殊的用户-计算机对象攻防