调用的组件无法进行调试
无法访问组件中的代码进行修改
必须是非常完善的组件才能进行使用
适用于所有使用 .NET Framework 的地方
实例:
MEF 位于 ComponentModel.Composition 程序集中
添加 System.ComponentModel.Composition 和 System.ComponentModel.Composition.Hosting 的项目引用
ImportAttribute 属性声明了某些操作为导入;在撰写对象时,它将由组合引擎进行填写。
ImportAttribute 属性由且只能由 ExportAttribute 填写。 如果可用数目超过一,,则组合引擎生成错误。 你可以使用 ImportManyAttribute 属性来创建可由任意数目的导出填写的导入
Lazy<T,?TMetadata> 是由 MEF 提供来保存对导出的间接引用的类型。 除了导出对象本身,你还可以获取导出元数据或描述导出对象的信息。 每个Lazy<T,?TMetadata> 都包含一个代表实际操作的 IOperation 对象和一个代表元数据的 IOperationData 对象。
ExportAttribute 属性函数和之前一致。ExportMetadataAttribute 属性将采用名称值对形式的元数据附加到导出
DirectoryCatalog 将把在扩展目录中的所有程序集中发现的部件添加到撰写容器中。
MEF 组合模型的核心是包含所有可用部件并执行撰写的撰写容器。 (它是对导入到导出进行的匹配。) 撰写容器最常用的类型是CompositionContainer
MEF使用实例接口定义:
[csharp]
namespace Interface
{
public interface IBookService
{
void GetBookName();
}
}
针对于接口的3个实现,如下代码所示:
[csharp]
using System;
using System.ComponentModel.Composition;
using Interface;
namespace ComputerBookServiceImp
{
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("Computer Book");
}
}
}
上面代码除了对接口的实现以外,有两点需要说明的:
1、项目中引用了System.ComponentModel.Composition程序集,使用MEF必须使用该程序集。
2、使用了Export特性标记了ComputerBookService类,并且声明其类型为IBookServivce,通过此特性说明该类是MEF的一个导出部件。
其他两个版本的实现和上面雷同,代码如下:
HistoryBookServiceImp
[csharp]
using System;
using System.ComponentModel.Composition;
using Interface;
namespace HistoryBookServiceImp
{
[Export(typeof(IBookService))]
public class HistoryBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("History Book");
}
}
}
MathBookServiceImp
[csharp]