这几天学习Prism,看了下帮组文档和程序。在Prism中专门讲解模块化程序开发的有俩个列子,一个是用Unity解耦实现Prism的依赖注入,另一个列子是用MEF解耦是实现Prism的依赖注入。

案例(一):ModularityWithUnity.Silverlight

开启应用程序

(1)App.xaml.cs中

private void Application_Startup(object sender, StartupEventArgs e)
{
//创建Shell实例,不需要设置RootVisual
QuickStartBootstrapper bootstrapper = new QuickStartBootstrapper();
bootstrapper.Run();
}

(2)QuickStartBootstrapper.cs

//实例化Shell
//最基本的实现,确保Shell被整合到容器中
protected override void InitializeShell()
{
base.InitializeShell();

Application.Current.RootVisual = (UIElement)this.Shell;
}

构建模块

这里以Module A 为例,构建Module A,主要实现IModule接口

(1)首先新建Silverlight项目ModuleA

(2)实现IModule接口

 

View Code

namespace ModuleA
{
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文件中

<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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中还要加上这样一段代码

//用Xaml文件注册模块(在UnityBootstrapper中)
//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中

//Shell响应来至UI的请求,加载一个模块通过调用ModuleManager.LoadModule方法。
//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中模块化程序的理解。相关推荐

  1. Box2d学习笔记三:box2d中几个重要的类

    我们已经知道box2d中的唯一物种:刚体,然而仅仅一个刚体对象并不能完成相应的物理模拟.如果看过box2d的帮助文档就知道,b2Body中提供的函数和属性中,并没有我们需要的物理属性,可以回忆一下,我 ...

  2. 【RobotStudio学习笔记】(十)模块化程序

    当程序比较复杂,或者程序内存在重复的部分时,模块化程序设计往往是比较可行的办法.在RobotStudio中可以通过在主程序中调用不同的例行程序,达到使代码逻辑清晰的目的. 将搬运工件的动作保存为例行程 ...

  3. 学习笔记三:GMM模型以及EM算法理解及代码实现

    第三章 GMM模型以及EM算法 1.潜变量模型 使用潜变量解释观测变量的数学模型,称之为潜变量模型 潜变量模型将不完全数据(观测数据)的边缘分布转换成容易处理的完全数据(观测数据+潜变量)的联合分布. ...

  4. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  5. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  6. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  7. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  8. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  9. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

最新文章

  1. 创建指向以下位置中的matlab脚本的符号链接_【分享吧】浅析软链接与硬链接
  2. JavaMail学习之一-邮件传输协议
  3. wordpress mysql 安装_wordpress 搭建安装教程 1 安装数据库、SQLyog
  4. SQL注入语法类型——报错注入
  5. Keepalived配置日志文件
  6. select下拉框赋值和取值
  7. 锁定弹出层(jquery语法)
  8. 浙江大学计算机科学与技术学院分数线,浙江大学录取分数线一般在多少 高考最低多少分能上浙大...
  9. Server Tomcat Server at localhost failed to start解决方案
  10. 购物车中 商品的选中状态之后的一些业务逻辑操作
  11. 基于8086CPU微处理器的汇编学习之JMP指令
  12. 关于DG32f103C8T6 不启动的问题-调试可以运行自启动不行
  13. python socket recvfrom 超时捕获_python-udp客户端超时机制
  14. 【预测模型】基于粒子群优化宽度学习实现预测matlab代码
  15. 安装新版的winetricks_winetricks中文修改版(wine模拟器)
  16. Windbg线上问题分析:生产环境应用高CPU问题分析
  17. 带小数的二进制转十进制(C代码)
  18. lt;祝我生日快乐gt; 的词曲写的真好..杰伦果然是我心中的偶像
  19. 浏览器解析渲染页面过程
  20. 操作系统笔试面试笔记总结

热门文章

  1. 通过View.post()获取View的宽高
  2. P2016 战略游戏
  3. 关于textarea包在div的自适应问题
  4. 跨域,json与jsonp格式
  5. Unity Game Starter Kit for Windows Store and Windows Phone Store games
  6. 解决J2EE系统应用性能问题常用方法
  7. 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
  8. recycleview 嵌套高度问题_简单解决RecyclerView嵌套的RecyclerView条目显示不全和宽度不能铺满...
  9. pythonprint()_python基础1 print()函数
  10. bat 域 本机管理员密码_Windows域中特殊的用户-计算机对象攻防