MEF框架学习之旅(一)概念

声明:

本系列文章是通过网络采集并加上本人的个人理解融合而成,都好几年过去了感觉学习跟研究这个框架的人仍然很少,所以想写一个小教程帮助大家一起提高。本人技术并不是很高深,如有偏差请多多指正。参考文章如下:

blogs.msdn.com/b/gblock/archive/tags/mef/

www.cnblogs.com/prinsun/tag/MEF/

http://www.cnblogs.com/wangchunming/category/341016.html

http://www.cnblogs.com/errorif/category/295552.html

http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html

有些章节内容属于照搬,还请原创者原谅。也感谢其他朋友的分享。。。

—————————————————————————–

一、基本概念

MEF:Managed Extensibility Framework,.NET 4.0中带来的一个基于托管的扩展程序开发框架, 其实MEF是为您的解决方案打破紧耦合的依赖。

Contract:契约,即一种约定,具体在代码中表现为接口和抽象类。

Import:导入,是部件向要通过可用导出满足的容器提出的要求, 可修饰字段、属性或构造函数参数。

Export:导出,是部件向容器中的其他部件提供的一个值, 可修饰类、字段、属性或方法。

1.为了使导入与导出匹配,导入和导出必须具有相同的协定。 协定由一个字符串(称为”协定名称”)和已导出或导入对象的类型(称为“协定类型”)组成。只有在协定名称和协定类型均匹配时,才会认为导出能够满足特定导入。

2.协定参数中的其中任意一个或两者可能为隐式也可能为显式。

3.通常应对公共类或成员声明导出和导入。其他声明也受支持,但如果导出或导入私有成员、受保护成员或内部成员,将会损坏部件的隔离模型,因此建议不要这样做。

Part:部件,即实现契约的类。

Catalog:目录(理解意义),存放部件的地方,当需要某个部件时,会在目录中寻找。

Container:容器,存放目录并进行部件管理,如导出、导入等。

Compose:组装,通过容器在目录中寻找到实现了相应契约的部件,进行部件的组装。

 

二、框架图示

 untitled

三、基本使用示例

启动 MEF 涉及以下几个步骤:

添加需要容器创建的约定的导入。

创建 MEF 用于发现部件的目录。

创建组合部件实例的容器。

通过对容器调用 Composeparts 方法并传入具有导入的实例,来进行组合。

 

步骤1:创建新的控制台应用程序

 MyConsoleMEF

2步:添加引用

引用System.ComponentModel.Composition

  

步骤3:创建ILogger接口

代码段

  interface ILogger

{

void Write(string message);

}

 

4步:ILogger的实现

代码段

public class ConsoleLogger : ILogger

{

void ILogger.Write(string message)

{

Console.WriteLine(message);

}

}

public class DebugLogger : ILogger

{

void ILogger.Write(string message)

{

Debug.WriteLine(message);

}

}

public class EventLogLogger : ILogger

{

void ILogger.Write(string message)

{

EventLog.WriteEntry(
"MEFSample", message);

}

}

 

步骤5:创建主程序

代码段

class Program

{

public ILogger[] Loggers { get; private set; }

static void Main(string[] args)

{

Program p
= new Program();



foreach (var logger in p.Loggers)

{

logger.Write(
"写日志");

}



Console.Read();

}



}

 

6步:装饰部分

步骤6.1:装饰部分导出

下面的代码是使用导出属性的部分装饰

要求为ILogger契约

代码段

[Export(typeof(ILogger))]

public class ConsoleLogger : ILogger

{

void ILogger.Write(string message)

{

Console.WriteLine(message);

}

}

[Export(
typeof(ILogger))]

public class DebugLogger : ILogger

{

void ILogger.Write(string message)

{

Debug.WriteLine(message);

}

}

[Export(
typeof(ILogger))]

public class EventLogLogger : ILogger

{

void ILogger.Write(string message)

{

EventLog.WriteEntry(
"MEFSample", message);

}

}

 

 

步骤6.2:装饰的需求

下面的代码使用的是ImportMany特性,

代码段

[ImportMany]
public ILogger[] Loggers { get; private set; }

 

 

步骤7:组合

下面的代码说明如何启动在MEF组成过程。

下面的步骤用于静态构造函数:

 创建目录 (告诉MEF寻找部件

 创建容器 (主机),并交给目录

 容器调用Compose方法。

 最后一步是从容器中获得logger

代码段

class Program

{

[ImportMany]

public ILogger[] Loggers { get; private set; }

static void Main(string[] args)

{

Program p
= new Program();



var assemblyCatalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());

CompositionContainer container
= new CompositionContainer(assemblyCatalog);

var exports = container.GetExports<ILogger>();



foreach (var logger in p.Loggers)

{

logger.Write(
"写日志");

}



Console.Read();

}



}

 

本文链接



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量