在应用程序中托管(Hosing) MEF 涉及到创建组合容器(CompositionContainer) 实例,添加可组合部件(Composable Parts),包括应用程序宿主(Host)本身并进行组合(Composing)。

 
下面是托管涉及的步骤。

 
1.创建宿主(Host)类。下面的例子我们使用控制台应用程序,宿主(Host)类即 Program 类。
2.添加 System.ComponentModel.Composition 程序集引用。
3.添加以下 using 语句:using System.ComponentModel.Composition。
4.添加 Compose() 方法,创建容器实例,组合到宿主。
5.添加 Run() 方法调用 Compose()。
6.在 Main() 方法初始化宿主类。

注意:对于 ASP.NET 或者 WPF 应用程序,宿主类被运行时实例化,这些步骤都是没有必要的。

 
代码片段:
 
    class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
} [Import]
public IMessageSender MessageSender { get; set; } public void Run()
{
Compose();
MessageSender.Send("Message Sent");
} private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this, new EmailSender());
}
}
 
7.定义一个或多个导出点 (Exports) 宿主会进行导入。下面的代码中,我们定义了 IMessageSender 接口。我们也通过申明 [System.ComponentModel.Composition.Export] 特性定义了 EmailSender 可组合部件(Composable Part)用以导出(export) IMessageSender。
 
    public interface IMessageSender
{
void Send(string message);
} [Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
 
8.在宿主类中为每个导入点(Import)添加 [System.ComponentModel.Composition.Import] 特性,下例中 IMessageSender 作为导入点(import)添加到 Program 类。
 
        [Import]
public IMessageSender MessageSender { get; set; }
 
9.使用 MEF,我们有多种途径把部件(Part)添加到容器中。一种是直接添加现有的可组合部件(Composable Part)实例,而第二种,更常用的是通过使用目录(Catalogs),我们将在下面部分提到。
 
a.直接添加部件(Parts)到容器中

通过使用 ComposePart 扩展方法在 Compose() 方法中手动添加任意可组合部件(Composable Part)。在下例中,EmailSender 实例连同当前 Program 类的实例添加到容器(Container)。
 
        private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this, new EmailSender());
}
 
b.使用 AssemblyCatalog 添加到容器
 
通过使用目录(Catalog),容器自动处理部件(Parts)创建而不是显示的添加。为此,在 Compose() 方法创建目录(Catalog)。接着创建解析器(Resolver)目录(Catalog)并且传递给容器构造器(Container Constructor)。
 
下例中 AssemblyCatalog 由传递给构造器(Constructor)的执行程序集(Executing Assembly)创建。我们没有添加 EmailSender 的实例,它会从传递给当前的程序中目录中(Catalog)获取实例。
 
        private void Compose()
{
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
 
当上面的代码被编译并执行,应用程序将由 IMessageSender 导入点(import)。Send() 方法会被调用在控制台输出“Message Send”。
 
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System;
using System.Reflection; namespace HostingMefInAnApplication
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
} [Import]
public IMessageSender MessageSender { get; set; } public void Run()
{
Compose();
MessageSender.Send("Message Sent");
} private void Compose()
{
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
} public interface IMessageSender
{
void Send(string message);
} [Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
}

MEF 编程指南(一):在应用中托管 MEF的更多相关文章

  1. MEF 编程指南(七):使用目录

    目录(Catalogs)   MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF ...

  2. MEF 编程指南(二):定义可组合部件和契约

    可组合部件(Composable Parts)   在 MEF 内部可组合部件是一个可组合单元.可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务.在 MEF 编程模型中,可组合部件 ...

  3. 【转】MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

    MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用.在Silverlight中只是宿主的方式有所不同,实际上在 ...

  4. MEF 编程指南(十二):批量组合

    MEF 容器实例并非不可变的.如果目录支持改变(像监控目录变动)或者在运行时添加/移除部件都可能发生改变.以前,你不得不做出改动并且调用 CompositionContainer 上的 Compose ...

  5. MEF 编程指南(十一):查询 CompositionContainer

    CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载.   在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明.   当请求单一实例的时候,如果没发 ...

  6. MEF 编程指南(十):重组

    有些应用程序被设计成在运行时动态地改变.例如,一个新的扩展可能被下载,或者其他原因变得不可用.MEF 依靠我们称之为重组(Composition)的技术处理,在初始化组合以后改变导入值的场景.   导 ...

  7. MEF 编程指南(九):部件生命周期

    理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports)   共 ...

  8. MEF 编程指南(六):导出和元数据

    声明导出解释了部件导出服务的基础知识和价值观(Values).有时候出于种种原因,导出关联信息是非常必要的.通常,用于解释关于功能公共契约的具体实现.允许导入满足约束要求的导出,或者导入所有可用的实现 ...

  9. MEF 编程指南(四):声明导入

    组合部件通过 [System.ComponentModel.Composition.ImportAttribute] 特性声明导入.类似于导出,也有几种不同的方法声明导入,即通过:字段(Fields) ...

随机推荐

  1. ti processor sdk linux am335x evm setup.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm setup.sh hacking # 说明: # 本文主要对TI的sdk中的setup.sh脚本进行解读 ...

  2. Oracle 课程三之表设计

    完成本课程的学习后,您应该能够: •普通堆表优点和缺点 •理解rowid •全局临时表优点.缺点和适用场景 •分区表的类型和原理.优点和缺点.适用场景 •表字段的高效设计 •sequence的设计   ...

  3. 顶 企业站常用css横向导航菜单

    <!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/T ...

  4. ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)

    我的个人博客站在使用百度富文本编辑器UEditor修改文章时,遇到了一些问题,(不知是bug,还是我没有配置好).但总算找到了解决方法,在此记录下来. 小站首页文章列表显示为(显示去除HTML标签后的 ...

  5. Android中的音频播放(MediaPlayer和SoundPool)

    Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...

  6. 22、TTS技术

    Android对TTS技术的支持 Android 1.6开始支持TTS(Text To Speech)技术,通过该技术可以将文本转换成语音. TTS技术的核心是android.speech.tts.T ...

  7. Most Powerful(ZOJ 3471状压dp)

    题意:n个原子,两两相撞其中一个消失,产生能量,给出任意两原子相撞能产生的能量,求能产生的最大能量. 分析:dp[i]表示情况为i时产生的最大能量 /*#include <map> #in ...

  8. codeforces 685B Kay and Snowflake 树的重心

    分析:就是找到以每个节点为根节点的树的重心 树的重心可以看这三篇文章: 1:http://wenku.baidu.com/link?url=yc-3QD55hbCaRYEGsF2fPpXYg-iO63 ...

  9. [算法] 希尔排序 Shell Sort

    希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是: ...

  10. CORBA

    公共对象请求代理体系结构(Common Object Request Broker Architecture)