MEF 和 Silverlight 入门指南(第三部分)






4.99/5 (28投票s)
在本文中,我使用了一个控制台应用程序描述了MEF的必要性。阅读它,别忘了投票并分享您的反馈。
引言
在我关于MEF的最后两篇文章中,即《MEF与Silverlight入门指南(第一部分)》和《MEF与Silverlight入门指南(第二部分)》,我借助一个控制台应用程序和一个Silverlight应用程序描述了该框架。希望这给了您一个初步的概念,以及MEF的功能。
在本文中,我将尝试为您提供更多关于MEF及其优势的知识。这次,我将再次使用一个控制台应用程序,以便更清晰地展示底层场景。希望像之前的文章一样,这也能帮助您更好地理解该框架,以便在未来的需求中使用它。
首先,请在此处阅读我的教程第一部分:MEF与Silverlight入门指南(第一部分)。这将让您了解开发MEF应用程序的先决条件。我们将以该章节为基础来演示本章节的内容。
本教程和演示的目的是创建一个应用程序,并在需要时添加其功能,而无需更改实际的应用程序代码。因此,最终,我们只需要将新的DLL插件插入应用程序,就可以添加新功能,而无需修改原始代码。将来,如果我们想添加一个新功能,可以通过将新的DLL部署到客户端PC来实现,他们可以在不升级应用程序的情况下访问它们。如果他们想删除某个功能,只需删除相应的DLL即可,而不会影响原始应用程序。
听起来很有趣?那么让我们通过一个示例应用程序来讨论每个要点,这将让您更深入地了解MEF的强大功能。阅读完整文章,尽情享受吧。
项目设置
让我们从一个使用Visual Studio 2010、以Framework Version 4.0为目标的控制台应用程序开始。我将使用Visual C#代码格式来演示示例应用程序。如果您不熟悉,我建议您阅读完整文章以理解基础知识,之后一旦您充分理解了MEF的必要性和用法,您就可以轻松地用其他语言实现。
![Image [http://www.kunal-chowdhury.com] Image [http://www.kunal-chowdhury.com]](http://lh4.ggpht.com/_MOj9mkIt81A/THgTyvnl8VI/AAAAAAAAGgA/V3uOyCgZlRc/image29.png?imgmax=800)
添加接口库项目
创建控制台应用程序项目后,请向解决方案中添加一个类库项目。为此,请右键单击解决方案,然后在上下文菜单中选择“添加”->“新建项目”。

在“添加新项目”对话框中,选择“类库”模板,并将项目名称设置为“PersonLibrary
”。单击“确定”让Visual Studio IDE为您创建相应的项目。

IDE创建项目后,在该库项目中创建一个名为“IPerson
”的空接口。该接口将如下所示:

之所以使用空接口,仅仅是为了本演示示例,并区分MEF框架需要满足的类型。
设置主项目
首先,您需要在控制台应用程序项目中添加两个程序集引用。一个是PersonLibrary
项目引用,另一个是System.ComponentModel.Composition.dll引用。为此,请右键单击主应用程序项目,然后单击“添加引用”。找到这些程序集并将其包含在项目中。需要PersonLibrary
DLL引用来使用IPerson
接口,需要System.ComponentModel.Composition
DLL引用来使用MEF组合和导入部件。
在主程序中组合部件
现在,打开控制台应用程序项目中的Program.cs,创建一个IPerson[]
类型的属性,以便我们可以导入多个IPerson
类型的契约。为属性设置ImportMany
特性。有关详细信息,请参见下面的代码:

在Program
类中,添加一个名为CreateCompositionContainerFromDirectory()
的方法,并创建一个指向应用程序根目录的DirectoryCatalog
。然后,从目录创建CompositionContainer
,并调用ComposeParts()
来满足容器。现在,进入您的Main()
方法,在创建程序类实例后调用CreateCompositionContainerFromDirectory()
。代码已在上面给出。
导出Employee类
关于导入部件就到这里。现在我们必须创建契约并将它们导出到MEF。为此,让我们在同一解决方案中创建另一个类库项目。将新库项目命名为EmployeeLibrary
。添加新项目后,将PersonLibrary
项目的程序集引用添加到新库中以使用IPerson
接口。还要为MEF导出契约添加System.ComponentModel.Composition
程序集引用。
设置好项目后,就可以创建类了。让我们创建一个名为“Employee
”的类,并继承自IPerson
接口。在构造函数中,打印一条消息,以便在创建类实例时,它会在控制台中打印消息。为类型为IPerson
的类设置“Export
”特性。
看看这里的代码:

导出Customer类
与上面的库项目类似,在同一解决方案中创建另一个库项目,并将其命名为CustomerLibrary
。像为EmployeeLibrary
一样,添加“PersonLibrary
”项目和System.ComponentModel.Composition
的程序集引用。
项目设置完成后,只需在此项目中创建一个类似于“Employee
”的类,但这里我们将类命名为“Customer
”。在构造函数中放入一条不同的消息,以便在创建此类的实例后,它会在控制台中打印出来。
这是代码

演示
哇!我们的编码部分完成了。现在是时候进行演示,展示我们想要做什么以及我们实现了什么。生成整个解决方案,并确保其中没有任何错误,并且解决方案已成功生成。
转到主应用程序的debug文件夹下的“bin”目录,即“HelloMEFDemo3
”。在那里,您将找到编译器生成的“HelloMEFDemo3.exe”。这就是我们刚刚开发的控制台应用程序。双击它来运行应用程序。 哇!它是一个空白应用程序!!!怎么回事?
别担心。我们运行了应用程序,但应用程序不知道Employee
或Customer
类。我们没有添加引用让MEF自动导入。那么我们该怎么办?我们需要添加引用到主控制台应用程序,对吗?不,请在此之前稍等。我们不应该在那里添加引用。原因如下:“我们的应用程序不应该知道契约部件。稍后,当我们想要时,我们将能够自动包含它们,而无需在应用程序中编写一行代码。”
那么,该怎么办?首先关闭您的控制台应用程序。现在,转到名为“EmployeeLibrary
”的项目bin目录,并将库DLL复制到控制台应用程序的输出目录。请参见下面的屏幕截图。我只是将EmployeeLibrary.dll放在可执行应用程序的根文件夹中。
现在,再次运行您的应用程序,您将在屏幕上看到打印的消息。
关闭控制台窗口,然后将CustomerLibrary.dll从项目输出目录复制到应用程序根目录。再次运行控制台应用程序。您将在屏幕上看到来自客户的消息也被打印出来。看看这里的输出:
摘要
所以,我们从这个小演示中学到的是:“在不更改实际应用程序的情况下,我们可以非常轻松地插入我们的新代码”。在不更改主应用程序的情况下,很容易在我们的应用程序中包含附加功能。您只需要将DLL库放在正确的位置,您的应用程序就可以拾取它。如果您将来需要删除某个功能,只需从部署的用户的目录中删除引用DLL即可。无需将应用程序回滚到之前的版本。
它对于附加功能实现和将其插入客户端应用程序非常有用。此外,它还非常容易维护版本。因此,它在代码方面为您提供了更大的灵活性和可扩展性。
希望这对您更详细地理解MEF有所帮助。现在您可以想象它在您的应用程序开发中的强大功能了。继续探索它,为未来做好准备。
不要忘记为它投票。建议和反馈总是受到赞赏。
如果您有任何疑问/疑虑,请随时告知我。我将始终渴望尽快为您提供帮助。
历史
- 2010 年 8 月 28日:初始发布