C#可扩展编程之MEF第2章(抄录)

时间:2022-04-02 03:31:18

调用的组件无法进行调试

无法访问组件中的代码进行修改

必须是非常完善的组件才能进行使用

适用于何处

  适用于所有使用 .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]  

 

 

C#可扩展编程之MEF第2章(抄录)

C#可扩展编程之MEF第2章(抄录)

namespace Interface  

{  

    public interface IBookService  

    {  

        void GetBookName();  

    }  

}  


针对于接口的3个实现,如下代码所示:

[csharp]  

 

 

C#可扩展编程之MEF第2章(抄录)

C#可扩展编程之MEF第2章(抄录)

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]  

 

 

C#可扩展编程之MEF第2章(抄录)

C#可扩展编程之MEF第2章(抄录)

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]