当前位置: 首页 > news >正文

MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

  MEF可以在传统应用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主,MEF也为Silverlight提供了独特的宿主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll动态链接库。

  Silverlight中提供了一种新的宿主MEF的方式,只需要在Application_Startup事件处理函数中通过调用System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer类里面的方法一行代码就可以完成MEF的宿主,这是非常方便、简单的。详细如下代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private void Application_Startup( object sender,StartupEventArgse)
{
CompositionInitializer.SatisfyImports(
this );
}

  下面用一个简单的示例程序演示下在Silverlight中的MEF的基本应用。比如编写一个日志组件,分别提供两种写日志的方式,既写文本日志和数据库日志,那么对于需要通过MEF托管的部件可以如下代码定义:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public interface ILogger
{
void WriteLog( string message);
}

[Export(
" TXT " , typeof (ILogger))]
public class TXTLogger:ILogger
{
public void WriteLog( string message)
{
System.Console.WriteLine(message);
}
}

[Export(
" DB " , typeof (ILogger))]
public class DBLogger:ILogger
{
public void WriteLog( string message)
{
System.Console.WriteLine(message);
}
}

  分别将两个不同的日志记录组件都通过[ExportAttribute]进行标注为导出部件,并分别为其设置好通信契约,那么在导入他们的地方就直接通过契约确定分别导入什么类型的日志记录实现部件。可以通过提供一个统一的门面服务以供系统中统一调用,大致如下代码所示:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
/// </summary>
[Export]
public class FacadeService
{
[Import(
" TXT " )]
public ILoggerTXTLogger{ get ; set ;}

[Import(
" DB " )]
public ILoggerDBLogger{ get ; set ;}
}

  实际上门面服务作为一个简单、单纯的辅助类,也是可以通过MEF进行动态装配的,如上代码就将FacadeService也进行了[ExportAttribute]标注,表示此门面类也是一个可装配的部件,那么在App中同样可以通过[ImportAttribute]进行导入的。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 导入FacadeService
/// </summary>
[Import]
public FacadeServiceService{ get ; set ;}

  接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public MainPage()
{
InitializeComponent();

varservice
= (Application.Current as App).Service;
service.TXTLogger.WriteLog(
" 写日志到文本文件 " );
service.DBLogger.WriteLog(
" 写日志到数据库 " );
}

  注:本文参考于Hosting MEF in Silverlight using CompositionInitializer ,点击连接可访问英文原文。

  MEF官方网站:http://mef.codeplex.com/

   推荐资源:在应用程序中宿主MEF

  

相关文章:

  • abstract virtual interface区别
  • OpenGL教程之Alpha混合
  • 模式识别与机器学习读书笔记——2.1 Binary Variables
  • 【转】【翻译】Orx官方教程:0.基础(Basic)
  • ASP.NET——/应用程序中的服务器错误
  • 【转】【翻译】Orx官方教程:1. object
  • WEB上传文件的插件uploadify
  • 读书笔记,深入理解linux内核第三版
  • OGC标准介绍 2
  • Android游戏开发之游戏帧动画的播放与处理(七)
  • OGC标准介绍 3
  • [我研究]7月第三周
  • 查看服务器实例的属性信息函数--SERVERPROPERTY
  • 10w级别的mysql数据插入
  • 绿色 . IT . 从小事做起
  • es6(二):字符串的扩展
  • iOS 系统授权开发
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • jQuery(一)
  • JWT究竟是什么呢?
  • leetcode讲解--894. All Possible Full Binary Trees
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • quasar-framework cnodejs社区
  • React-生命周期杂记
  • SQLServer之索引简介
  • supervisor 永不挂掉的进程 安装以及使用
  • vue 配置sass、scss全局变量
  • 阿里云应用高可用服务公测发布
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从tcpdump抓包看TCP/IP协议
  • 翻译:Hystrix - How To Use
  • 工作中总结前端开发流程--vue项目
  • 关于List、List?、ListObject的区别
  • 今年的LC3大会没了?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端路由实现-history
  • 如何设计一个比特币钱包服务
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 为什么要用IPython/Jupyter?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​一些不规范的GTID使用场景
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • "无招胜有招"nbsp;史上最全的互…
  • $.ajax()参数及用法
  • $.ajax()方法详解
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13)Hive调优——动态分区导致的小文件问题
  • (solr系列:一)使用tomcat部署solr服务
  • (二)JAVA使用POI操作excel
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (六)vue-router+UI组件库
  • (论文阅读40-45)图像描述1
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐