可组合部件(Composable Parts)
 
在 MEF 内部可组合部件是一个可组合单元。可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务。在 MEF 编程模型中,可组合部件用 [System.ComponentModel.Composition.Import] 和 [System.ComponentModel.Composition.Export] 特性标识,以便声明导出点和导入点。可组合部件应该包含至少一个导出点。可组合部件要么显式添加到容器或者通过使用目录创建。MEF 访问默认目录识别 Export 特性标识的可组合部件。
契约(Contacts)
 

可组合部件不直接依赖另一个,相反依赖字符串标识的契约。每个导出点享有一个契约,并且每个导入点申明的他所需的契约。容器利用契约信息在导入点和导出点之间做匹配。如果没有指定契约,MEF 会隐式使用完全限定名的契约类型。如果传递了类型,也会使用完全限定名。
 
注意:默认情况下通过类型传递给契约。尽管契约可以是任意字符串,但是可能导致歧义(Ambiguity)。比如:“Sender”可能与另一个库的“Sender”实现重叠。基于这个原因,如果需要指定字符串的契约,强烈建议契约名应该包括公司名的限定命名空间,例如:“Contoso.Exports.Sender”。
以下代码片段,所有导出契约是等价的(Equivalent)。
    [Export]public class Exporter { }[Export(typeof(Exporter))]public class Exporter1 { }[Export("Chapter02.Exporter")]public class Exporter2 { }

接口/抽象契约
针对可组合部件的一种常见模式是导出接口或者抽象类型,而不是一个具体的类型。这允许导入者完全从特定的导出实现中解耦,这导致关注点的分离。例如:下面可以看到两种导出 IMessageSender 的 Sender 实现。Notifier 类导入 IMessageSender 集合,调用他的 Send() 方法。新的 MessageSender 可以很容易添加到系统。

    [Export(typeof(IMessageSender))]public class EmailSender : IMessageSender{public void Send(string message){Console.WriteLine("Invoke EmailSender Send() method");Console.WriteLine(message);}}[Export(typeof(IMessageSender))]public class TCPSender : IMessageSender{void IMessageSender.Send(string message){Console.WriteLine("Invoke TCPSender Send() method");Console.WriteLine(message);}}public interface IMessageSender{void Send(string message);}

契约程序集(Contract Assemblies)
 

使用 MEF 构建可扩展应用程序时的常见模式是发布契约程序集。契约程序集仅包含使用者可以扩展应用程序的契约类型。通常是接口,但是也可能是抽象类。另外,契约程序集包含导入点使用的元数据(Metadata)视图接口,以及任何自定义 MEF 导出特性。

注意:你必须指定特定的存在的导出接口类型(IMessageSender),否则类型(EmailSender)本身将被导出。
 
原文地址:
http://mef.codeplex.com/wikipage?title=Parts&referringTitle=Guide

转载于:https://www.cnblogs.com/JavCof/p/3669705.html

MEF 编程指南(二):定义可组合部件和契约相关推荐

  1. CoreAnimation编程指南(二)渲染架构

    1.虽然核心动画的图层和Cocoa的视图在很大程度上没有一定的相似性,但是他们两者最大的区别是,图层不会直接渲染到屏幕上. 2.在模型-视图-控制器(model-view-controller)概念里 ...

  2. MEF程序设计指南(转)

    在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 Sy ...

  3. MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)...

    如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载.解析.实际上MEF的动态下载的底层实现一样是使用的WebClient,然后利用AggregateCatalog进行动态组合 ...

  4. trident原理及编程指南

    trident原理及编程指南 @(STORM)[storm, 大数据] trident原理及编程指南 一理论介绍 一trident是什么 二trident处理单位 三事务类型 1spout类型 2st ...

  5. 高质量C++/C编程指南 1

    高质量C++/C编程指南 文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件 文件标识: 当前版本: 1.0 作 者: 林锐 博士 完成日期: 2001年7月24日 http://ma ...

  6. libuv 中文编程指南(零)前言

    最近看了一些有关 libuv 的东西,另外复习了一些与同步.异步.阻塞.非阻塞,异步IO(aio)的东西, 算是技术积累吧,等有时间了整理出一个完整的文档出来,希望在今后的编程中用到. 不多说了,本文 ...

  7. libuv 中文编程指南

    最近看了一些有关 libuv 的东西,另外复习了一些与同步.异步.阻塞.非阻塞,异步IO(aio)的东西, 算是技术积累吧,等有时间了整理出一个完整的文档出来,希望在今后的编程中用到. 不多说了,本文 ...

  8. Beej网络编程指南《二》

    Beej网络编程指南<二> 6客户端-服务器背景 这是一个客户机-服务器的世界,宝贝.网络上几乎所有的东西都处理客户机进程与服务器进程之间的对话,反之亦然.以telnet为例.当你用tel ...

  9. 并发编程指南(二)Dispatch Queue

    Dispatch Queues Grand Central Dispatch(GCD)调度队列是执行任务的强大工具. 通过调度队列,您可以相对于调用者异步或同步地执行任意代码块. 您可以使用调度队列执 ...

  10. (二)shell编程之变量定义与使用

    shell编程之变量定义与使用 SHELL编程模块课程目标 ① Shell的基本语法结构 如:变量定义.条件判断.循环语句(for.until.while).分支语句.函数和数组等: ② 基本正则表达 ...

最新文章

  1. 容器的使用(6-12)
  2. 离散时间系统的相位响应
  3. 自定义ImageView 实现双击放大缩小还原,无极缩小和旋转及拖动(多机型测试很稳定)
  4. 实用的 Python —— base64
  5. selenium官网下载地址
  6. python 生意参谋_电商 Python 抓取 生意参谋-访客数据
  7. 汇编达人视频学习4(MOVS、STOS、REP、PUSH、POP、JMP、CALL、RET指令)
  8. Pandoc安装与使用总结
  9. kubectl config 命令
  10. 一只小蜜蜂... hdu2044
  11. 入行程序员培训还是不培训
  12. \ddd \xhh
  13. 简单地实现文章的查重
  14. Chapter1:监督学习、无监督学习:AndrewNg吴恩达《机器学习》笔记
  15. 合并报表软件excel
  16. wpspbc按钮是什么意思_意外:我不小心按下了路由器上的wps按钮?我该怎么办?...
  17. 有哪些好笑的关于程序员的笑话
  18. elementUI From表单校验,整体校验和部分校验的使用方法
  19. 面向对象软件设计原则(四) —— 包的设计原则
  20. 佳信客服接口文档 REST API(第二部分)包含用户、聊天室、群聊、消息管理,通用接口数据结构、通用接口返回码

热门文章

  1. PHP实现用户浏览记录接口
  2. Windows10 安装 protobuf
  3. ios3怎么取消长按弹出菜单_针对数码打印机中叠印怎么处理
  4. 想不明白:为什么龙芯取消了MIPS版OpenJDK8开源
  5. cc1: all warnings being treated as errors
  6. LINUX下载编译g729
  7. LINUX用户执行过的命令,保存在.bash_history
  8. 《TensorFlow深度学习应用实践》学习笔记1
  9. Ubuntu 16上命令行提示长目录的解决办法
  10. 上海项目危机经历与感想