zoukankan      html  css  js  c++  java
  • MEF程序设计指南一:在应用程序中宿主MEF

      在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既System.ComponentModel.Composition.dll,详细如下代码块:

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

      通过上面的代码实现就可以完成MEF的宿主,实际上在使用MEF的开发过程中并不会如此简单的应用。可能会定义一个或多个导入(Import)和导出(Export)部件,然后通过MEF容器进行组合,其实也可以理解为“依赖注入”的一种实现。比如定义一个图书接口和一个接口的实现类,在此基础上使用MEF的导入导出特性:

    public interface IBookService
    {
        
    void GetBookName();
    }
        
    /// <summary>
    /// 导入
    /// </summary>
    [Export(typeof(IBookService))]
    public class ComputerBookService : IBookService
    {
        
    public void GetBookName()
        {
            Console.WriteLine(
    "《Hello Silverlight》");
        }
    }

      如上代码通过使用MEF的[System.ComponentModel.Composition.Export]对接口的实现进行导出设置,让接口的实现以容器部件的方式存在,然后通过组合容器进行装配加载,这个过程中就包括了接口的实例化的过程。接下来就需要在MEF的宿主程序中定义一个接口的属性,并为其标注[System.ComponentModel.Composition.Import]特性以实现接口实现类的导入。如下代码块:

    /// <summary>
    /// 导入接口的实现部件(Part)
    /// </summary>
    [Import]
    public IBookService Service { getset; }

      完成了导入导出的接口与实现的开发及特性配置,下面就剩下一步组合了,也就是本文提到的将部件和宿主程序自身添加到组合容器中,以实现导入(Import)和导出(Export)的组合装配。

    /// <summary>
    /// 宿主MEF并组合部件
    /// </summary>
    private void Compose()
    {
        var catalog 
    = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        var container 
    = new CompositionContainer(catalog);
        
    //将部件(part)和宿主程序添加到组合容器
        container.ComposeParts(this,new ComputerBookService());
    }

      通过以上步骤就完成了MEF的宿主以及一个简单的部件组合的应用示例,下面是本文的完整代码示例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using System.Reflection;

    namespace HostingMef
    {
        
    public interface IBookService
        {
            
    void GetBookName();
        }
        
        
    /// <summary>
        
    /// 导入
        
    /// </summary>
        [Export(typeof(IBookService))]
        
    public class ComputerBookService : IBookService
        {
            
    public void GetBookName()
            {
                Console.WriteLine(
    "《Hello Silverlight》");
            }
        }

        
    class Program
        {
            
    /// <summary>
            
    /// 导入接口的实现部件(Part)
            
    /// </summary>
            [Import]
            
    public IBookService Service { getset; }
            
            
    /// <summary>
            
    /// 宿主MEF并组合部件
            
    /// </summary>
            private void Compose()
            {
                var catalog 
    = new AssemblyCatalog(Assembly.GetExecutingAssembly());
                var container 
    = new CompositionContainer(catalog);
                
    //将部件(part)和宿主程序添加到组合容器
                container.ComposeParts(this,new ComputerBookService());
            }

            
    static void Main(string[] args)
            {
                Program p 
    = new Program();
                p.Compose();

                p.Service.GetBookName();
            }
        }
    }

      注:本文参考Hosting MEF in an application,详细请大家阅读原文。

      MEF官方网站:http://mef.codeplex.com/

    相关说明

     本文属学习笔记文章,愿与有志者共同学习交流。欢迎转载,但请在明显地位标记本文的原文连接。  

    作      者:Beniao

    文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

  • 相关阅读:
    1242 斐波那契数列的第N项
    1256 乘法逆元
    1264 线段相交
    1265 四点共面
    Uva10881 Piotr's Ants
    hdu 5438 Ponds 长春网赛1002
    CodeForces 540D Bad Luck Island 概率dp
    hdu 1281 二分图残量增广
    hdu 2444判定二分图+最大匹配
    hdu 3416 Marriage Match IV
  • 原文地址:https://www.cnblogs.com/beniao/p/1770276.html
Copyright © 2011-2022 走看看