在应用程序中宿主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 { get; set; }
完成了导入导出的接口与实现的开发及特性配置,下面就剩下一步组合了,也就是本文提到的将部件和宿主程序自身添加到组合容器中,以实现导入(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 { get; set; }
        
        /// <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/

转载于:https://blog.51cto.com/beniao/343346

在应用程序中宿主MEF相关推荐

  1. Silverlight中使用CompositionInitializer宿主MEF

    MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用.在Silverlight中只是宿主的方式有所不同,实际上在 ...

  2. 在 .NET Compact Framework 2.0 中宿主 ActiveX 控件

    适用于: ActiveX Microsoft .NET Compact Framework 版本 2.0 摘要:了解如何在使用 .NET Compact 的应用程序中宿主 ActiveX 控件.本文提 ...

  3. 科研文献|根相关真菌群落反映了亚热带森林中宿主的空间共生模式

    TITLE:Root-associated fungal community reflects host spatial co-occurrence patterns in a subtropical ...

  4. 技巧:Silverlight应用程序中如何获取ASP.NET页面参数

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://terrylee.blog.51cto.com/342737/87093 ...

  5. 获取控制台窗口的句柄(HWND)和程序中输出回车键

    一.获取窗口句柄基于类名或窗口名称: http://support.microsoft.com/kb/124103/zh-cn Win32 API 提供用于获取与一个控制台应用程序相关联的窗口句柄没有 ...

  6. 在WinForm程序中嵌入ASP.NET

    现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分不清什么时候是在本地什么时候是在网络.而这 ...

  7. 在.NET Core中使用MEF

    题记:微软的可托管扩展框架也移植到.NET Core上了. 可托管扩展框架(Managed Extensibility Framework,MEF)是微软为大型应用程序(比如Visual Studio ...

  8. java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象

    在Web应用程序中,(    )负责将HTTP请求转换为HttpServletRequest对象 A Servlet对象 B HTTP服务器 C Web容器 D JSP网页 首先我们来看看web程序的 ...

  9. 在WinForm程序中嵌入ASP.NET[转]

    在WinForm程序中嵌入ASP.NET 现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分 ...

最新文章

  1. 目标跟踪初探(DeepSORT)
  2. poj2752 字符串子KMP应用
  3. Windows 10 下 Anaconda3 (Python 3.8) 配置 OpenCV-4.4.0
  4. python的5种高级用法
  5. mysql putty 备份_Linux下mysql数据库的备份-putty
  6. 雅礼集训 2017 Day1
  7. 计算机二级如何接受审阅者修订,操作方法 合并修订文档 步骤1 要求审阅者
  8. python网络编程100例_python网络编程
  9. android真实项目教程(五)——有时三点两点雨_by_CJJ
  10. SpringMVC实现ajax上传图片实时预览
  11. 2022年低压电工考试题及在线模拟考试
  12. 最详细的选型攻略!选择工业相机必须搞懂这10大要素!(建议收藏)
  13. 5+:基于单细胞测序和转录组数据构建胰腺癌中坏死性凋亡相关的预后模型
  14. 插件!最好用的翻译插件!!
  15. Java编程笔记6:接口
  16. cocos3.X拖动精灵移动
  17. 【ZT】iSpring Free Cam – 免费易用的「录制屏幕」工具 [Windows]
  18. 这些前端资源,你值得拥有
  19. 业务中台系统架构:大中台+小前台电子商务系统搭建框架思维
  20. 装在笔记本里的私有云环境:网络存储篇(中)

热门文章

  1. 微信公众号自定义菜单跳转小程序
  2. 布尔类型和三目运算符
  3. SQL Server创建视图——视图的作用
  4. React router 4 获取路由参数,跨页面参数
  5. Java线程池 源码分析
  6. css 全局 兼容性问题
  7. device not ready cuda
  8. No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
  9. mongodb安装失败与解决方法(附安装教程)
  10. PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法