zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    注解
    idea 快速生成返回值快捷方式
    异常处理
    finally 关键字
    博客园美化
    winform中webBrowser模拟网页操作中遇到的问题
    使用NPOI 2.1.1读取EXCEL2003/2007返回DataTable
    使用事务和SqlBulkCopy批量插入数据
    Java String比较
    Java 实例级别的锁和类级别的锁
  • 原文地址:https://www.cnblogs.com/JavCof/p/3666089.html
Copyright © 2011-2022 走看看