MEF 编程指南(一):在应用中托管 MEF

在应用程序中托管(Hosing) MEF 涉及到创建组合容器(CompositionContainer) 实例,添加可组合部件(Composable Parts),包括应用程序宿主(Host)本身并进行组合(Composing)。

 
下面是托管涉及的步骤。
 
1.创建宿主(Host)类。下面的例子我们使用控制台应用程序,宿主(Host)类即 Program 类。
2.添加 System.ComponentModel.Composition 程序集引用。
3.添加以下 using 语句:using System.ComponentModel.Composition。
4.添加 Compose() 方法,创建容器实例,组合到宿主。
5.添加 Run() 方法调用 Compose()。
6.在 Main() 方法初始化宿主类。

注意:对于 ASP.NET 或者 WPF 应用程序,宿主类被运行时实例化,这些步骤都是没有必要的。
 
代码片段:
 
    class Program

    {

        static void Main(string[] args)

        {

            Program p = new Program();

            p.Run();

        }

 

        [Import]

        public IMessageSender MessageSender { get; set; }

 

        public void Run()

        {

            Compose();

            MessageSender.Send("Message Sent");

        }

 

        private void Compose()

        {

            var container = new CompositionContainer();

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

        }

    }
 
7.定义一个或多个导出点 (Exports) 宿主会进行导入。下面的代码中,我们定义了 IMessageSender 接口。我们也通过申明 [System.ComponentModel.Composition.Export] 特性定义了 EmailSender 可组合部件(Composable Part)用以导出(export) IMessageSender。
 
    public interface IMessageSender

    {

        void Send(string message);

    }

 

    [Export(typeof(IMessageSender))]

    public class EmailSender : IMessageSender

    {

        public void Send(string message)

        {

            Console.WriteLine(message);

        }

    }
 
8.在宿主类中为每个导入点(Import)添加 [System.ComponentModel.Composition.Import] 特性,下例中 IMessageSender 作为导入点(import)添加到 Program 类。
 
        [Import]

        public IMessageSender MessageSender { get; set; }
 
9.使用 MEF,我们有多种途径把部件(Part)添加到容器中。一种是直接添加现有的可组合部件(Composable Part)实例,而第二种,更常用的是通过使用目录(Catalogs),我们将在下面部分提到。
 
a.直接添加部件(Parts)到容器中

通过使用 ComposePart 扩展方法在 Compose() 方法中手动添加任意可组合部件(Composable Part)。在下例中,EmailSender 实例连同当前 Program 类的实例添加到容器(Container)。
 
        private void Compose()

        {

            var container = new CompositionContainer();

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

        }
 
b.使用 AssemblyCatalog 添加到容器
 
通过使用目录(Catalog),容器自动处理部件(Parts)创建而不是显示的添加。为此,在 Compose() 方法创建目录(Catalog)。接着创建解析器(Resolver)目录(Catalog)并且传递给容器构造器(Container Constructor)。
 
下例中 AssemblyCatalog 由传递给构造器(Constructor)的执行程序集(Executing Assembly)创建。我们没有添加 EmailSender 的实例,它会从传递给当前的程序中目录中(Catalog)获取实例。
 
        private void Compose()

        {

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

            var container = new CompositionContainer(catalog);

            container.ComposeParts(this);

        }
 
当上面的代码被编译并执行,应用程序将由 IMessageSender 导入点(import)。Send() 方法会被调用在控制台输出“Message Send”。
 
using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;

using System;

using System.Reflection;

 

namespace HostingMefInAnApplication

{

    class Program

    {

        static void Main(string[] args)

        {

            Program p = new Program();

            p.Run();

        }

 

        [Import]

        public IMessageSender MessageSender { get; set; }

 

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

        }

    }

}

你可能感兴趣的:(编程)