组合部件通过 [System.ComponentModel.Composition.ImportAttribute] 特性声明导入。类似于导出,也有几种不同的方法声明导入,即通过:字段(Fields)、属性(Properties)和构造器参数(Constructor Parameters)。
 
 
属性导入(Property Imports)
 
 
为了向属性导入值,使用 [System.ComponentModel.Composion.ImportAttribute] 特性标识。如下例中导入 IMessageSender。
 
        [Import]
public IMessageSender MessageSender { get; set; }
 
构造器参数(Constructor Parameters)

也可以通过构造器参数指定导入。这意味着为每个导入添加构造器参数,而不必为每个属性添加导入。使用构造器参数导入,遵循以下几点。

 
1. 构造器添加 [System.ComponentModel.Compostition.ImportingConstructorAttribute] 特性 。
2. 为每个导入添加构造器参数。

例如:在 Program 类的构造器中导入 MessageSender
 
        [ImportingConstructor]
public Program(IMessageSender messageSender)
{ }
参数导入(Parameter Imports)

有几种不同的方式在构造器上定义导入。

1. 隐式导入 - 默认情况下,容器会使用参数类型确认契约。例如:下面的代码,将使用 IMessageSender 契约。
2. 显示导入 - 如果想指定导入契约,在相应参数上添加 [System.ComponentModel.Composition.ImportAttribute] 特性。
 
 
字段导入(Field Imports)
 
MEF 也支持直接为字段导入值。

 
        [Import]
private IMessageSender _messageSender;
 
注意:在完全信任(Full Trust)的时候支持导入或者导出私有成员(字段、属性和方法),但是部分信任(Medium/Partial)可能会出问题。
 
 
缺省导入(Optional Imports)
 
 
MEF 允许指定缺省导入。当启用它,如果类型可用容器会提供导出,否则将导入设置为 Default<T>。为了得到一个缺省导入,在导入上设置 AllowDefault=true。如下例:
 
OrderController 缺省导入一个 Logger。如果 Logger 不存在,会设置 private _logger 字段为 DefaultLogger 实例,否则使用导入的 Logger。

 
 
导入集合(Importing Collections)
 
除了单一导入以外,也可使用 ImportMany 特性导入集合。这意味着所有特定的契约实例都会被容器导入。

MEF 部件也可以支持重排(Recomposition)。这意味着容器中新的导出变得可用,集合会自动更新为新的设置。例如:下面的 Notifier 类导出 IMessageSender 集合。这意味着如果容器中有3个可用的 IMessageSender 导出,在组合时候会被推送到 Senders 属性。

 
 
    public class Notifier
{
[ImportMany(AllowRecomposition=true)]
public IEnumerable<IMessageSender> Senders { get; set; } public void Notify(string message)
{
foreach (IMessageSender sender in Senders)
{
sender.Send(message);
}
}
}
IPartImportsSatisfiedNotification 接口
 
某些情况下,在 MEF 对于类的实例的导入过程完成时候获得通知是非常重要的。如果要获得通知,实现 [System.ComponentModel.Composition.IPartImportsSatisfiedNotification] 接口。这个接口仅有一个方法:在类实例结合完成时候,OnImportsSatisfied 被调用。
 

        public void OnImportsSatisfied()
{
// when this is called, all imports that could be satisfied have been satified.
}
 
原文地址:

MEF 编程指南(四):声明导入的更多相关文章

  1. 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

    在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类.字段.属性以及方法级别的导出部件,通过查看Ex ...

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

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

  3. MEF 编程指南(三):声明导出

    组合部件通过 [System.ComponentModel.Composition.ExportAttribute] 特性声明导出.MEF 有几种不同的方式声明导出,包括在部件层面(Part Leve ...

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

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

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

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

  6. View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views

    Views Because view objects are the main way your application interacts with the user, they have many ...

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

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

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

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

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

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

随机推荐

  1. AJAX在GBK编码页面中传中文参数乱码的问题

    ---恢复内容开始--- 页面编码是GBK的情况下传递中文有乱码,解决方法如下: 在ajax传递前用若是Array,JSON,等其它对象,可用JSON.stringfy字符串序列化后,赋值给ajax传 ...

  2. poj 2553 The Bottom of a Graph

    求解的是有向图中满足“自己可达的顶点都能到达自己”的顶点个数如果强连通分量中某个顶点,还能到达分量外的顶点,则该连通分量不满足要求// 因此,本题要求的是将强连通分量缩点后所构造的新图中出度为0的顶点 ...

  3. jquery加入购物车飞入的效果

    主要原理是:点击当前图片的时候,复制(克隆)当前图片在当前位置,然后利用jQuery的animate()方法实现图像的飞入效果 效果预览:http://runjs.cn/detail/qmf0mtm1 ...

  4. delphi 编译的时候 把Warning去除的方法

    delphi  编译的时候  把Warning去除的方法 在 添加 {$WARNINGS OFF}

  5. MySQL基础之第7章 索引

    第7章 索引 MySQL中,所有的数据类型都可以被索引,包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 7.1.索引简介 7.1.1.索引的含义和特点 BTREE索引,HASH索 ...

  6. winform实现自动更新并动态调用form实现

    winform实现自动更新并动态调用form实现 标签: winform作业dllbytenull服务器 2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报  分类: c#200 ...

  7. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  8. Cyborg Genes

    题意: 给两个字符串,求最短的以两字符串为子序列的字符串和个数 分析: 最长公共子序列的变形,num[i][j]表示个数 #include <map> #include <set&g ...

  9. codeforces 687C - The Values You Can Make 简单dp

    题意:一个数组a[i],你可以挑出若干个数(只能挑一次)加起来等于k, 针对每一种方案,你可以选出这若干个数的子集来组合新数 最后所有的方案能组合出多少种数 分析:一看数据范围n,k<=500 ...

  10. 如何用chrome修改js代码,跳过网站等待时间

    用chrome修改js代码 By Z.H. Fu 切问录 [maplewizard.github.io](http://maplewizard.github.io ) 网页中大部分的限制都是由js编写 ...