zoukankan      html  css  js  c++  java
  • MEF学习笔记(1):在一个应用程序里托管MEF

    应用程序里托管MEF

    应用程序里托管MEF包括创建一个CompositionContainer实例,添加组成部件,包括宿主本身,然后组合。

    下面是组合的步骤:

    1. 创建一个宿主类,下面的例子里我们使用控制台应用程序,所以宿主是Program类。
    2. 添加System.ComponentModel.Composition的引用;
    3. 在头部添加using System.ComponentModel.Composition;
    4. 添加一个Compose()方法,用来创建一个container实例,并跟宿主组合;
    5. 添加一个Run()方法,用来执行Compose();
    6. 在Main()里实例化宿主类。

    注意:对于ASP.NET和WPF应用程序,宿主类在运行时就已经实例化,所以这个步骤没有必要。

    经过上面的步骤后,代码变成:

    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、定义一个或多个导出(Export)用于给宿主导入(Import)。下面的代码,我们会定义一个IMessageSender接口,我们还会定义一个EmailSender组合部件,用来导出一个IMessageSender,这得通过声明 [System.ComponentModel.Composition.Export] 属性来实现:

      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有几个方法可以做到这个。一个方法是直接添加目前的组成部件实例,另一个更常用的方法是通过使用目录,这个我们在下面的章节会提到。

    直接添加部件到容器

     在Compose()方法里通过重载方法ComposeParts()手动添加每个组成部件。下面的例子里一个EmailSender的实例和当前要导入的Program实例一起添加到容器

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

    用数据集目录(AssemblyCatalog)添加到容器(container)
    通过使用这个目录,container句柄会自动添加部件,而不是显式的添加。为了实现这个,在Compose()里创建一个目录catalog。然后从目录创建一个解析器,把它传给container的构造函数。

    下面的例子是一个用正在执行的程序集创建的AssemblyCatalog传进构造函数。我们没有添加EmailSender实例因为它会在当前程序集的目录被发现。

      private void Compose()
      {
        var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);
      }

    Assembly.GetExecutingAssembly()Gets the assembly that contains the code that is currently executing.

    经过上面的步骤之后,代码应该是这样:

      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”

  • 相关阅读:
    MySQL数据库封装和分页查询
    程序员的价值在哪里?
    奇葩的程序员
    京东咚咚架构演进
    程序员必看的《黑客帝国》,你看懂了吗?
    微信后台技术“干货们”带来的启发
    drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求、解析、渲染、响应、异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中INSTALLED_APPS注册意义 ,数据库配置
    drf框架, 接口(api) Django FBV => CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源
    前端Vue框架 05 第三方插件(vuex: 组件间交互的(移动端), axios
    前端Vue框架 04 路由:逻辑跳转、路由传参 项目组件的数据局部化处理data(){ return{} } 组件的生命周期钩子 组件间通信 全局配置css, js
  • 原文地址:https://www.cnblogs.com/wangchunming/p/2467128.html
Copyright © 2011-2022 走看看