代码改变世界

使用MEF宿主在一个应用程序上

2012-04-04 23:27  Oliver_Zhao  阅读(470)  评论(0编辑  收藏  举报

  使用MEF宿主在一个应用程序上,这个应用程序创建一个CompositionContainer的实例,并往容器内添加Composable Parts。

以下是使用宿主的步骤。

  1. 创建一个宿主类。在示例中,我们使用控制台应用来做宿主。
  2. 添加System.ComponentModle.Composition引用。
  3. 添加一个Compose()方法,用来创建容器实例和组合宿主。
  4. 添加一个Run()方法,调用Compose()方法。
  5. 在Main()方法中,调用宿主类。
  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);
    }
  }

  6.定义一个或多个Exports,这些Exports将被Import到宿主中。

  public interface IMessageSender
  {
    void Send(string message);
  }

  [Export(typeof(IMessageSender))]
  public class EmailSender : IMessageSender
  {
    public void Send(string message)
    {
      Console.WriteLine(message);
    }
  }

  7.在宿主中添加属性并打Import标志。

  [Import]
  public IMessageSender MessageSender { get; set; }

  8.有两种方式将组件(Parts)添加到容器中。

一、直接将组件(Parts)添加到容器内。

  private void Compose()
  {
    var container = new CompositionContainer();
    container.ComposeParts(this, new EmailSender());
  }

二、通过程序集目录添加。

  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);
    }
  }

想查看更详细信息,请点击这里