在应用程序中托管(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. 零基础学通C语言,福利来啦!!!!zfhl.ke.qq.com

  2. ViewPager 滑动页(三)

    需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,当滑动到最后一页时,结束当前activity,进入下一个activity: 效果图: 实现分析: 1.目录结构: 代码实现: 1.Po ...

  3. 【LR】录制测试脚本中的基本菜单

    学习来源: MBoo,小强老师性能测试及Loadrunner培训  ——录制测试脚本: 1.Vuser -> run-time settings ->General Run Logic : ...

  4. Web自动化框架搭建之二基于数据驱动应用简单实例~~

    整体框架,先划分成细小功能模块~~,从最简单的开始,介绍 实现循环百度搜索实例: #coding=utf-8 '''Created on 2014��6��9�� @author: 小鱼'''impo ...

  5. 关于SecureCRT的安装和破解问题以及xp系统的串口问题

    今天下午找了几个小时的软件,因为交叉编译环境要搭好,其中SecureCRT还有串口问题要解决,我突然间发现我开始光盘中的SecureCRT坏掉了,在网站上下载SecureCRT,结果要很多的积分,这样 ...

  6. AWR

    Automatic Workload Repository是10g引入的一个重要组件.在里面存贮着近期一段时间内,默认是7天,数据库活动状态的详细信息 手动得到一份AWR报告: SQL> exe ...

  7. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  8. 【转】JS设计模式开篇

        (原文地址:http://blog.chinaunix.net/uid-26672038-id-3904513.html)     本文主要讲述一下,什么是设计模式(Design patter ...

  9. win7旗舰版通知windows不是正版副本解决方法

    原文转载http://www.cnblogs.com/simple_666/archive/2013/04/13/win7%E6%97%97%E8%88%B0%E7%89%88%E9%80%9A%E7 ...

  10. Java——泛型(最易懂的方式讲解泛型)

    来自: 代码大湿 代码大湿 写在前面: 只要认真看过,基本能很熟悉泛型的特性.泛型是JDK1.5之后出现的,比如JDK1.5之前的ArrayList,会出现2个问题 1:向ArrayList当中添加对 ...