在应用程序中集成MEF

在应用程序中集成MEF


在应用程序中集成MEF包括创建CompositionContainer的一个实例,添加组合部件,包括程序宿主自身,然后组合.

以下是与集成相关的步骤

1. 创建宿主类. 下列例子中我们使用控制台应用程序, 所以宿主就是Program.

2. 添加System.ComponentModel.Composition程序集的引用.

3. 添加下列using语句: using System.CompoentModel.Composition;

4. 添加Compose()方法, 创建container实例, 然后组装.

5. 添加Run()方法, 调用Compose()方法.

6. Main()方法中实例化宿主类.

注意:ASP.NETWPF程序中, 没有必要实例化宿主程序.

下列代码片断指示出如何编码

  using System.ComponentModel.Composition;

  using System.ComponentModel.Composition.Hosting;

  using System.Reflection;

  using System;

 

  public class Program

  {

    public static void Main(string[] args)

    {

      Program p = new Program();

      p.Run();

    }

 

    public void Run()

    {

      Compose();

    }

 

    private void Compose()

    {

      var container = new CompositionContainer();

      container.ComposeParts(this);

    }

  }

7. 定义一个或多个导出(宿主程序中将导入). 这段程序中我们定义了一个IMessageSender接口和一个EmailSender的组合部件, 通过标注[System.ComponentModel.Composition.Export]属性, EmailSender标注成导出.

  public interface IMessageSender

  {

    void Send(string message);

  }

 

  [Export(typeof(IMessageSender))]

  public class EmailSender : IMessageSender

  {

    public void Send(string message)

    {

      Console.WriteLine(message);

    }

  }

8. 给宿主程序的每一个入口添加属性, 用属性[System.ComponentModel.Composition.Import]属性修饰. 以下是一个导入示例, IMessageSender作为导入添加到Program类中.

  [Import]

  public IMessageSender MessageSender { get; set; }

9. 把部件添加到容器中. MEF, 有若干种添加的方法, 一种是直接添加已存在的可组合部件的实例. 更通用的方法是通过使用catalog来实现, 随后的例子中会提及这种方法. 

直接把部件添加到容器中.
Compose()方法中通过ComposeParts()方法把每一个部件添加到容器中. 例子中, EmailSender的实例和宿主程序一起被添加到容器中.

 

  private void Compose()

  {

    var container = new CompositionContainer();

    container.ComposeParts(this, new EmailSender());

  }

通过AssemblyCatalog来添加
通过使用catalog, 容器自动处理部件的创建. 创建Compose()方法. 在方法中创建catalog并且作为参数传递给容器的构造方法.In the example below an AssemblyCatalog is created with the executing assembly passed into the constructor. We're not adding an instance of EmailSender as it it will be discovered in the catalog that was passed for the current assembly.下面的例子中, 通过传递可执行程序集给AssemeblyCatalog的构造方法来实例化. 我们并没有创建EmailSender的实例, catalog可以通过当前程序集自己找到它.

  private void Compose()

  {

    var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());

    var container = new CompositionContainer(catalog);

    container.ComposeParts(this);

  }

以下是完整的代码:

  using System.ComponentModel.Composition;

  using System.ComponentModel.Composition.Hosting;

  using System.Reflection;

  using System;

 

  public class Program

  {

    [Import]

    public IMessageSender MessageSender { get; set; }

 

    public static void Main(string[] args)

    {

      Program p = new Program();

      p.Run();

    }

 

    public void Run()

    {

      Compose();

      MessageSender.Send("Message Sent");

    }

 

    private void Compose()

    {

      AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

      var container = new CompositionContainer(catalog);

      container.ComposeParts(this);

    }

  }

 

  public interface IMessageSender

  {

    void Send(string message);

  }

 

  [Export(typeof(IMessageSender))]

  public class EmailSender : IMessageSender

  {

    public void Send(string message)

    {

      Console.WriteLine(message);

    }

  }


上述代码编译执行时, 应用程序将和IMessageSender入口组合在一起. 执行时, Send()方法将被调用, 并且在控制台输出 “Message Sent”

posted @ 2010-03-12 23:28  天狼  阅读(509)  评论(1编辑  收藏  举报