托管可扩展性框架 (MEF) 入门






4.35/5 (9投票s)
使用 Visual Studio 2010 介绍托管可扩展性框架 (MEF)
背景
软件需求随着其所开发的业务的不断发展而不断发展。这种演变使得软件架构师和设计师的工作越来越困难。现代软件应该是可扩展的。这是一种在我们的应用程序中添加插件的支持。但是,现有的软件工具缺乏创建可扩展应用程序的良好机制。作为优秀的软件架构师和开发人员,我们总是寻求开箱即用的解决方案,以便我们可以更加关注业务需求。
引言
随着 Visual Studio 2010 的发布,Microsoft 推出了一个必须关注的优秀框架。它被称为MEF(托管扩展框架)。它基于与控制反转模式相同的软件原则。我们以遵循“低耦合”GRASP(通用责任分配软件模式)模式的方式设计软件组件。跳转到编写代码
由于我不希望浪费您的更多时间,我将开始使用 MEF 创建一个示例“Hello World”程序。让我们创建一个控制台 C# 应用程序。我们将应用程序命名为MEFIntro
。

现在,我们添加System.ComponentModel.Composition.dll的引用。

它在解决方案资源管理器中显示如下

现在,我们在Program.cs中添加我们需要创建第一个应用程序的命名空间。

我们在我们的命名空间MEFIntro
中实现两个类。它们如下所示
Program
(清单 1)SimpeHello
(清单 2)
MEF 中的依赖项是使用属性提供的。有两个基本属性。它们是Import和Export。如果您查看清单 1 中的Program
类,您可以看出,它的字符串属性 message 应该导入一些字符串。它没有指定此导入的来源。现在在清单 2 中,SimpleHello
导出一些字符串属性。其他组件可能需要此属性。在我们的示例中,这是Program
类。因此,很明显这两个类相互依赖。
现在,如果我们只是遵循牛仔式编码,我们将在Program
类中直接实例化MyHello
并使用MyHello.Message
属性填充其自己的Message
属性。但是,使用 MEF,我们不需要这样做。这是因为 MEF 负责注入依赖项。
为了确定软件组件之间的依赖关系,定义了目录(Program
类中的Run
方法)。在这里,我们使用了AssemblyCatalog
。可能存在多个相同或不同类型的目录。也可能还有其他目录,例如DirectoryCatalog
等。在CompositionContainer
中添加这些目录后,当我们调用容器的ComposeParts
方法时,所有依赖项都将得到解析。正如您所看到的,当我们调用ComposeParts
时,MyHello
类中使用Export
属性指定的string
属性Message
被复制到Program
类中使用Import
属性指定的string
属性Message
。
列表 1
class Program
{
[Import]
public string Message { get; set; }
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
var catalog = new hosting.AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new hosting.CompositionContainer(catalog);
container.ComposeParts(this);
Console.WriteLine(Message);
Console.ReadKey();
}
}
列表 2
public class MyHello
{
[Export]
public string Message
{
get { return "Hello World"; }
}
}
历史
- 2010年3月3日:文章发布