MEF 编程指南(四):声明导入
2024-10-19 08:45:25
组合部件通过 [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. 为每个导入添加构造器参数。
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.
}
原文地址:
最新文章
- 基于jquery实现图片拖动和曲线拖放
- 发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart
- 在Navicat for MySQL中打开视图时,提示视图没有主键的问题
- paper 35 :交叉验证(CrossValidation)方法思想
- MVC模式:实现数据库中数据的增删改查功能
- c++ socket 客户端库 socks5 客户端 RudeSocket™ Open Source C++ Socket Library
- Linux下查看进程和线程
- Game: Map Design Considerations 游戏地图设计指南
- SpringMVC学习总结(六)——SpringMVC文件上传例子(2)
- ZipArchive框架的文件压缩和解压
- 【HDOJ】4056 Draw a Mess
- LFS: Interface eth0 doesn&#39;t exist
- 宣布正式发布 Windows Azure Notification Hub,新增 SQL Server AlwaysOn 可用性组侦听器支持
- Hadoop获得先进的步步高(四)-试Hadoop
- Azure 基础:Table storage
- JDBC数据库增、删、改、查方法实现类
- Hadoop2 和 Hadoop1 区别
- Pycharm数据库连接错误
- 《深入理解JAVA虚拟机》笔记1
- SQL注入(dvwa环境)