MEF入门Word格式文档下载.docx

上传人:b****6 文档编号:19465670 上传时间:2023-01-06 格式:DOCX 页数:23 大小:174.55KB
下载 相关 举报
MEF入门Word格式文档下载.docx_第1页
第1页 / 共23页
MEF入门Word格式文档下载.docx_第2页
第2页 / 共23页
MEF入门Word格式文档下载.docx_第3页
第3页 / 共23页
MEF入门Word格式文档下载.docx_第4页
第4页 / 共23页
MEF入门Word格式文档下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

MEF入门Word格式文档下载.docx

《MEF入门Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MEF入门Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。

MEF入门Word格式文档下载.docx

MEF还提供了一些用来定位和加载可用扩展的方法。

MEF允许使用附加元数据对扩展进行标记,从而达到易于丰富的查询和筛选的目的。

工作原理

简短说一下MEF的工作原理,MEF的核心包括一个catalog和一个CompositionContainer。

category用于发现扩展,而container用于协调创建和梳理依赖性。

每个可组合的Part提供了一个或多个Export,并且通常依赖于一个或多个外部提供的服务或Import。

每个Part管理一个实例为应用程序运行。

从这里开始

下面我们从最简单的一个例子开始:

HelloWorld!

usingSystem;

namespaceHelloWorld

{

classProgram

{

staticvoidMain(string[]args)

Programprogram=newProgram();

program.Run();

}

publicvoidRun()

Console.WriteLine("

"

);

Console.ReadKey();

}

现在,如果不希望总是打印相同的字符串,我们应该稍微重构一下,把字符串提出来:

publicstringMessage{get;

set;

Console.WriteLine(Message);

下面来添加信息,并调用:

SimpleHellosimpleHello=newSimpleHello();

Message=simpleHello.Message;

publicclassSimpleHello

publicstringMessage

get{return"

;

到这里先打住!

看上面这段代码!

这段代码已经出现了紧偶合!

现在开始!

进军MEF!

首先要添加对MEF压缩包中System.ComponetModel.Composition.dll的引用。

好了,现在我开始改造我们的代码,解掉偶合。

usingSystem.ComponentModel.Composition;

[Import]

//SimpleHellosimpleHello=newSimpleHello();

//Message=simpleHello.Message;

[Export]

现在加入调用逻辑

usingSystem.Reflection;

[Import]

varcatalog=newAttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

varcontainer=newCompositionContainer(catalog.CreateResolver());

container.AddPart(this);

container.Compose();

[Export]

现在,程序可以正常运行了!

注意到在这个步骤中,我们做的几件事情:

i.创建了一个catalog,它将告诉MEF到什么地方去寻找Import和Export。

在这个例子中,我们告知在当前运行的程序集中。

出此之外还有很多种catalog,我们稍候会看到,当然你也可以去创建自己的catalog。

ii.创建了一个CompositionContainer,这是个高效的方式使不同的part在一起被调用。

iii.将Program的实例加入到container以便调用其依赖项。

iv.施展Compose魔法!

Message属性将在这步得到设置。

再做些更有趣的事情,我们来再添加一个信息:

varcatelog=newAttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

varcontainer=newCompositionContainer(catelog.CreateResolver());

publicclassMoreMessages

HelloAgain!

运行!

程序竟然崩掉了!

从错误信息可以看到,有太多的Export与Import适合,MEF不知道应该使用哪个Export。

然而,事实上很幸运,你可以告诉MEF可以处理0或多个结果,你要做的只是如下修改Message属性:

usingSystem.Collections;

usingSystem.Collections.Generic;

publicIEnumerable<

string>

Messages{get;

foreach(varmsginMessages)

Console.WriteLine(msg);

WOW!

太棒了!

现在我们把这个例子变得再复杂些。

我们通常将相互没有依赖关系的组放在不同的组件中,比如在不同的应用程序集中。

为了演示MEF对此支持,我们需要添加一个新建类库项目到解决方案中。

同HelloWorld项目一样,我们需要将System.ComponetModel.Composition.dll添加到HelloWorldMessage项目的引用中。

然后我们建立下面两个类:

namespaceHelloWorldMessage

publicclassMessageA

publicstringMessage{get{return"

HelloA!

}}

publicclassMessageB

HelloB!

现在,我们需要做的应该是在catalog中调用这些类,所以我们需要在目录中查找相应的part。

varcatelog=newDirectoryPartCatalog(@"

..\..\..\HelloWorldMessage\bin\Debug"

//newAttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());

注意:

DirectoryPartCatalog支持相对于AppDomain.CurrentDomain.BaseDirectory的相对路径中Part的查找。

可是我们还想要我们原来的SimpleHello和MoreMessage。

很幸运我们还有一个聚合catalog来从不同的一些资源中获取part。

varcatalog=newAggregatingComposablePartCatalog();

catalog.Catalogs.Add(newDirectoryPartCatalog(@"

));

catalog.Catalogs.Add(newAttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly()));

现在,我们只要将我们的扩展dll拷贝到指定的目录就可以实现扩展了。

更上一层楼

你也许看到了,主程序与Console.WriteLine()之间存在紧偶合,但有时我们并不一定需要将信息输出到Console上,有时需要记录到日志中,有时需要输出到WPF中,这时我们应该如何使用MEF对此进行处理呢?

首先我们要定义一个接口来描述输出字符串的约定。

为确保正确的依赖管理我们要创建一个新的类库项目”SharedLibrary”,向其中添加此接口并将其引用到其它团队项目中。

namespaceSharedLibrary

publicinterfaceIOutputString

voidOutputString(stringvalue);

回过头,我们现在来讲主程序中的Console.WriteLine()去掉了!

Message{get;

publicIOutputStringOut{get;

varcatelog=newAggregatingComposablePartCatalog();

catelog.Catalogs.Add(newDirectoryPartCatalog(@"

catelog.Catalogs.Add(newAttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly()));

foreach(varmsginMessage)

Out.OutputString(msg);

在这里我们定义了Out并用Out.OutputString()替换了Console.WriteLine()。

现在,在HelloWorldMessage项目中添加下面这个类:

usingSharedLibrary;

[Export(typeof(IOutputString))]

publicclassOutputExt1:

IOutputString

publicvoidOutputString(stringvalue)

Output="

+value);

现在生成并运行主程序!

神奇吧!

下面我们再来做一个IOutputString的实现,这次我们要做的更有创造力一些。

usingSystem.Linq;

publicclassOutputExt2:

IOutputString

foreach(varsinvalue.Split().Reverse())

Console.ForegroundColor=(ConsoleColor)(s.Length%10);

Console.Write(s+"

"

Console.Wr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1