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

MEF程序设计指南一:在应用程序中宿主MEF

  在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既System.ComponentModel.Composition.dll,详细如下代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private void Compose()
{
varcatalog
= new AssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer
= new CompositionContainer(catalog);
container.ComposeParts(
this );
}

  通过上面的代码实现就可以完成MEF的宿主,实际上在使用MEF的开发过程中并不会如此简单的应用。可能会定义一个或多个导入(Import)和导出(Export)部件,然后通过MEF容器进行组合,其实也可以理解为“依赖注入”的一种实现。比如定义一个图书接口和一个接口的实现类,在此基础上使用MEF的导入导出特性:

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

/// <summary>
/// 导入
/// </summary>
[Export( typeof (IBookService))]
public class ComputerBookService:IBookService
{
public void GetBookName()
{
Console.WriteLine(
" 《HelloSilverlight》 " );
}
}

  如上代码通过使用MEF的[System.ComponentModel.Composition.Export]对接口的实现进行导出设置,让接口的实现以容器部件的方式存在,然后通过组合容器进行装配加载,这个过程中就包括了接口的实例化的过程。接下来就需要在MEF的宿主程序中定义一个接口的属性,并为其标注[System.ComponentModel.Composition.Import]特性以实现接口实现类的导入。如下代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 导入接口的实现部件(Part)
/// </summary>
[Import]
public IBookServiceService{ get ; set ;}

  完成了导入导出的接口与实现的开发及特性配置,下面就剩下一步组合了,也就是本文提到的将部件和宿主程序自身添加到组合容器中,以实现导入(Import)和导出(Export)的组合装配。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 宿主MEF并组合部件
/// </summary>
private void Compose()
{
varcatalog
= new AssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer
= new CompositionContainer(catalog);
// 将部件(part)和宿主程序添加到组合容器
container.ComposeParts( this , new ComputerBookService());
}

  通过以上步骤就完成了MEF的宿主以及一个简单的部件组合的应用示例,下面是本文的完整代码示例:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;

namespace HostingMef
{
public interface IBookService
{
void GetBookName();
}

/// <summary>
/// 导入
/// </summary>
[Export( typeof (IBookService))]
public class ComputerBookService:IBookService
{
public void GetBookName()
{
Console.WriteLine(
" 《HelloSilverlight》 " );
}
}

class Program
{
/// <summary>
/// 导入接口的实现部件(Part)
/// </summary>
[Import]
public IBookServiceService{ get ; set ;}

/// <summary>
/// 宿主MEF并组合部件
/// </summary>
private void Compose()
{
varcatalog
= new AssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer
= new CompositionContainer(catalog);
// 将部件(part)和宿主程序添加到组合容器
container.ComposeParts( this , new ComputerBookService());
}

static void Main( string []args)
{
Programp
= new Program();
p.Compose();

p.Service.GetBookName();
}
}
}

  注:本文参考Hosting MEF in an application,详细请大家阅读原文。

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

相关文章:

  • 解决Linux(Fedora Ubuntu)笔记本的待机休眠
  • ExtJS 4中自定义Grid列标题的对齐方式
  • MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主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月第三周
  • 0基础学习移动端适配
  • idea + plantuml 画流程图
  • JAVA多线程机制解析-volatilesynchronized
  • JS函数式编程 数组部分风格 ES6版
  • JS题目及答案整理
  • node.js
  • PHP面试之三:MySQL数据库
  • SOFAMosn配置模型
  • supervisor 永不挂掉的进程 安装以及使用
  • VUE es6技巧写法(持续更新中~~~)
  • yii2权限控制rbac之rule详细讲解
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 机器学习中为什么要做归一化normalization
  • 近期前端发展计划
  • 软件开发学习的5大技巧,你知道吗?
  • 使用权重正则化较少模型过拟合
  • 说说动画卡顿的解决方案
  • 通过git安装npm私有模块
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 1.Ext JS 建立web开发工程
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #stm32驱动外设模块总结w5500模块
  • (Git) gitignore基础使用
  • (Note)C++中的继承方式
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)EOS中账户、钱包和密钥的关系
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 项目指定SDK版本
  • .net 反编译_.net反编译的相关问题
  • .net 获取url的方法
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)