托管可扩展性框架 (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日:文章发布


