摘要:
基础篇我学MEF系列(1):MEF是什么我学MEF系列(2):导入(Import)和导出(Export)我学MEF系列(3):导入(Import)和导出(Export) (续)我学MEF系列(4):组合容器(CompositionContainer)和目录(Catalog)我学MEF系列(5):创建策略(Creation Policy )和生命周期(Life Cycle)应用篇我学MEF系列(6):在Silverlight中应用MEF我学MEF系列(7):动态装配Silverlight组件我学MEF系列(8):MEF+Unity实现可扩展拦截器我学MEF系列(9):搭建一个简单的组合引擎(Co 阅读全文
随笔分类 - MEF
我学MEF系列(9):搭建一个简单的组合引擎(ComposionEngine)
2012-01-31 17:14 by ps_zw, 1432 阅读, 收藏, 编辑
摘要:
前言我们使用MEF的原因是因为它可以帮助我们解决很多现实问题。在实际项目中我们会将它进行封装以方便使用,使同一个team有一套使用MEF的标准机制。本文就来搭建一个简单的组合引擎。引擎应该具备的功能1.定义一个引擎类它可以组合指定的Catalog;2.它可以根据需要启动指定的扩展组件;3.引擎是可以停止的,这里就是通过它可以销毁组合容器;4.能够提供一组组合规则(可以通过元数据等方式实现),这点本文没有实现;5.为扩展组件提供统一的接口,方便扩展。搭建引擎步骤1:新建项目ComposionEngineCore和项目MEFDemo_Console,如下图所示:步骤2:在项目ComposionEn 阅读全文
我学MEF系列(8):MEF+Unity实现可扩展拦截器
2012-01-14 22:38 by ps_zw, 2281 阅读, 收藏, 编辑
摘要:
前言MEF很好的解决了扩展性问题,但本身不具有拦截器的功能,但是我们在应用程序中为了权限控制,日志记录等,却又需要拦截(AOP)器功能,本文主要介绍使用MEF+Unity实现可扩展的拦截器,使得我们的应用程序既具有可扩展性,又能实现拦截。先决条件1. 你需要了解MEF和Unity Framework的基本知识;2. 下载MEF Contrib (点击这里下载),MEF Contrib提供了支持Unity的拦截器扩展:CompositionIntegration;3. 下载Unity Application Block DLLs,点击这里下载;有了这些dll,我们就可以实现我们的MEF+Unit 阅读全文
我学MEF系列(7):动态装配Silverlight组件
2011-12-29 13:12 by ps_zw, 1476 阅读, 收藏, 编辑
摘要:
前言上一篇文章具体介绍到了如何在Silverlight中使用MEF,为了使SL扩展控件能够组合成功,我们在MEFDemo_SL中添加了对项目MEFDemo_SL.Extensons的引用,并在MainPage中using了扩展控件的命名空间。这看似有点不合逻辑,的确,这么做怎么都觉得很怪异,组件应该能够被动态发现。本篇文章就介绍一下如何动态加载dll。动态加载动态发现并加载silverlight的dll,需要先使用webclient将dll下载到客户端,再使用MEF进行组合。我们对上一篇文章的例子进行简单的修改:1.在MEFDemo_SL.Web中新建文件夹Parts,将MEFDemo_SL. 阅读全文
我学MEF系列(6):在Silverlight中应用MEF
2011-12-20 20:35 by ps_zw, 1821 阅读, 收藏, 编辑
摘要:
前言 通过前面MEF的基础知识的学习,我们已经知道MEF可以在控制台程序中寄宿。MEF还可以在Winform,Silverlight,WPF等应用程序中使用。在接下来的几篇文章中我们就重点介绍MEF是如何在这些应用程序中使用的。本文通过一个例子介绍MEF在Silverlight中的简单应用。正文第一步:打开VS2010新建一个Silverlight应用程序,命名为"MEFDemo_SL"。一路默认最后Solution的结构如下:在MainPage的设计器中添加一个容器控件,我们在这里添加一个TabControl(Name设置为"tcContainer") 阅读全文
我学MEF系列(5):创建策略(Creation Policy )和生命周期(Life Cycle)
2011-12-14 23:32 by ps_zw, 3576 阅读, 收藏, 编辑
摘要:
前言在前面的介绍中我们已经知道:导入和导出的匹配成功需要ContractType,ContractName,Metadata都匹配,这里我们还要介绍一个新的东西:创建策略(creation policy )。有时候我们在容器中的实例在每一个导入之间共享,即单例;有时候我们需要让每一个导入都拥有一个各自的实例,这在MEF中就是有创建策略决定的。生命周期(Life Cycle),每一个MEF的部件在容器中都有自己的生命周期,何时创建,何时释放等。本文就主要介绍一下MEF中得创建策略和生命周期创建策略 创建策略,其实就是组合容器决定如何创建部件。在组合容器组合部件时,如果导入和导出匹配成功,则组合容 阅读全文
我学MEF系列(4):组合容器(CompositionContainer)和目录(Catalog)
2011-12-12 00:12 by ps_zw, 6661 阅读, 收藏, 编辑
摘要:
前言 通过之前的文章,我们已经了解了MEF中的导入(Import)和导出(Export)。在本系列的第一篇文章中我们知道MEF其实还包括另外两个核心内容:组合容器(CompositionContainer)和目录(Catalog)。组合容器 Castle有容器,Unity有容器,同样作为一个能够提供扩展机制,能够支持依赖注入的框架肯定也有容器。MEF的组合模型的核心是组合容器,该容器包含所有可用的部件并执行组合操作 (即,将导入和导出配对)。通常我们使用的组合容器是:CompositionContainer ,MEF还提供一个组合对象:CompositionBatch。目录 前面我们有谈... 阅读全文
我学MEF系列(3):导入(Import)和导出(Export) (续)
2011-12-09 23:21 by ps_zw, 3213 阅读, 收藏, 编辑
摘要:
前言:在上一篇中,我们简单的介绍了导入和导出的基本知识以及一些基本用法,本篇将介绍一下在导出中经常使用的到两种技巧(其实就是MEF提供的两种特性):元数据(Metadata)和自定义导出(Custom Export)元数据 在MEF中,导出可提供自身的一些附加信息,我们称之为“元数据”。可通过元数据将导出的一些信息、属性传递给导入。上一篇介绍导入的时候提到了ImportMany,在ImportMany的时候有时候可能需要根据特定的条件过滤一些匹配的导出,这时我们可以利用导出的元数据作依据。此外,由于导入部件可以使用元数据来决定要使用哪些导出,或收集有关导出的信息而不必构造导出。 因此,导入必. 阅读全文
我学MEF系列(2):导入(Import)和导出(Export)
2011-12-04 23:20 by ps_zw, 4038 阅读, 收藏, 编辑
摘要:
前言:MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化编程模型,何为特性化编程这里不细究,简单说明下两个概念:“特性”和“编程模型”: 特性(Attribute):举例来说就是我们在开发过程中在类上标记的如:[Serializable]的标签。 编程模型(Programming Model):MEF中的编程模型是定义 MEF 所操作的概念性对象集的特定方法。MEF默认使用特性化编程模型,但是用户也可自定义编程模型。 导入(Import),导出(Export)是MEF扩展性机制实现的基础,是非常重要的两种部件。MEF中导入、导出部件均是通过特性来确定的(如:标记... 阅读全文
我学MEF系列(1):MEF是什么
2011-11-27 13:33 by ps_zw, 6347 阅读, 收藏, 编辑
摘要:
前言: 一种新技术,一个新框架的出现并不是偶然的,它们都是为了解决一定的实际问题。如今IT各种技术、框架的更新很迅速,一步留神就感觉自己out了,当然,技术没有优劣好坏之分,能更好的解决实际问题我们就使用它。MEF也是一样,它能解决很多的现实问题,当然它也有它的局限性。现实问题: 在开发大型应用程序,特别是客户端程序,我们会把各个独立的模块/功能包装成一个个小的组件,程序运行时按需加载。这样,我们就要求程序具有很好的扩展能力,包括但不限于以下列出的几个方面:1. 按需加载组件 ,动态可拆卸(可动态发现、重用和组合); 2. 能够在已投产的产品中灵活的加入新功能;3. 能够支持第三方扩展。如何解 阅读全文