MEF入门Word格式文档下载.docx
- 文档编号:19465670
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:23
- 大小:174.55KB
MEF入门Word格式文档下载.docx
《MEF入门Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MEF入门Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MEF 入门
![提示](https://static.bdocx.com/images/bang_tan.gif)