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 { 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());
}

时间: 2024-09-16 15:22:56

MEF程序设计指南一:在应用程序中宿主MEF的相关文章

MEF程序设计指南七

使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog) 如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载.解析.实际上MEF的动态下载的底层实现一样是使用的 WebClient,然后利用AggregateCatalog进行动态组合,详细可查看MEF的源代码(路径: Composition.Initialization\System\ComponentModel\Composition\Hosting \DeploymentCatalog

MEF程序设计指南八:部件生命周期(Parts Lifetimeime)托管

MEF中的每一个可进行动态装配的导出部件都是具有生命周期的,在没有特别需求的情况下一般都没有对生命周期进行管理,而实际上 MEF已为每一个部件进行了默认的生命周期管理,MEF的生命周期分为三种:Any.Shared及NonShared,被定义在 System.ComponentModel.Composition.CreationPolicy枚举对象中. namespace System.ComponentModel.Composition { public enum CreationPolicy

MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类.字段.属性以及方法 级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为 Attribute,并为其设置了使用范围. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA

MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用.在 Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主,MEF也为Silverlight提供了独 特的宿主方式,使用中需要引用 System.ComponentModel.Composition.Initialization.dll动态链接库. Silverlight中提供了一种新的宿主MEF

MEF程序设计指南三

MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用 按照MEF的约定,任何一个类或者是接口的实现都可以通过 [System.ComponentModel.Composition.Export] 属性将其他定义组合部件 (Composable Parts),在任何需要导入组合部件的地方都可以通过在特定的组合部件对象属性上使用 [System.ComponentModel.Composition.Import ]实现部件的组合,两者之间通过契约(Contrac

MEF程序设计指南六:MEF中的目录服务(DeploymentCatalog)

MEF提供的基于特性的编程模型,可以动态的根据目录找出程序集里面的所有程序部件. 对于MEF的目录服务MEF分别为WPF和 Silverlight提供了不同的目录机制.使用目录的主要功能就是方便实现程序部件的装载,以及动态的组合应用程序部件等功能,更可以非 常方便的得到程序部件的程序集.导出部件等相关数据. 如下代码块演示了如何在Silverlight中获取到当前应用程序的目录信息,包括了程序集和程序部件等. var catalog = new AssemblyCatalog(System.Re

MEF程序设计指南五

迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata) MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高 灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或者的附属对象初始化的时候进行实例化的,仅仅只 需要在需要使用到他的时候才会进行实例化,从系统的上来说这也是提高系统性能的一种可行的实现方式,这种方式就可以理解为对象的 迟延初始化,或者叫迟延加载.MEF也对此使用场

C++程序设计实践学材系列(6)——1.1.2 程序中可以加上给人看的注释

回到系列文章的目录--[系列文章目录] 回到本章目录--[第1章目录] 1.1.2 程序中可以加上给人看的注释 现在我们要提的第一个问题:这个程序中写出来的那么多文字,究竟是什么意思?回答了这个问题,目的在于写出自己的程序. 我们将给出另一个版本的输出"hello world"的C++程序. 例1.2 为输出"hello world"的C++程序加上注释 #include <iostream> //包含头文件iostream using namespac

微信小程序设计指南官方版放出

微信团队总喜欢在深夜搞个大惊喜,昨天晚间发布微信小程序开发文档,微信小程序设计指南也一同放出,都说腾讯的产品用户体验很好,我们就和ytkah一起看看这个小程序设计指南吧,参考一下他们的UI.交互.连接等各要素,以下是官方文档 基于微信小程序轻快的特点,我们拟定了小程序界面设计指南和建议. 设计指南建立在充分尊重用户知情权与操作权的基础之上.旨在微信生态体系内,建立友好.高效.一致的用户体验,同时最大程度适应和支持不同需求,实现用户与小程序服务方的共赢.友好礼貌 为了避免用户在微信中使用小程序服务