65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (9投票s)

2010年4月3日

CPOL

2分钟阅读

viewsIcon

51946

downloadIcon

348

使用 Visual Studio 2010 介绍托管可扩展性框架 (MEF)

背景

软件需求随着其所开发的业务的不断发展而不断发展。这种演变使得软件架构师和设计师的工作越来越困难。现代软件应该是可扩展的。这是一种在我们的应用程序中添加插件的支持。但是,现有的软件工具缺乏创建可扩展应用程序的良好机制。作为优秀的软件架构师和开发人员,我们总是寻求开箱即用的解决方案,以便我们可以更加关注业务需求。

引言

随着 Visual Studio 2010 的发布,Microsoft 推出了一个必须关注的优秀框架。它被称为MEF(托管扩展框架)。它基于与控制反转模式相同的软件原则。我们以遵循“低耦合”GRASP(通用责任分配软件模式)模式的方式设计软件组件。

跳转到编写代码

由于我不希望浪费您的更多时间,我将开始使用 MEF 创建一个示例“Hello World”程序。让我们创建一个控制台 C# 应用程序。我们将应用程序命名为MEFIntro

CreateProject.JPG

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

AddReference1.JPG

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

AddRefernce2.JPG

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

using.JPG

我们在我们的命名空间MEFIntro中实现两个类。它们如下所示

  1. Program(清单 1)
  2. SimpeHello(清单 2)

MEF 中的依赖项是使用属性提供的。有两个基本属性。它们是ImportExport。如果您查看清单 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日:文章发布
© . All rights reserved.