MEF,扩展预览
MEF,a primitive!
绪 MEF,"发现-重用-可动态组合";不依赖的特征编程。
什么是扩展?
扩展的本质是可以在多个程序中重用。扩展仍可以象原来一样,以程序特定的方式来实现。
MEF是什么?
MEF是微软为方便可扩展程序的创建,而提供的可管理的扩展框架简称,对程序扩展具有发现和组合能力。MEF是微软的原生框架,存在在.Net FX基准中。
用它解决什么问题?
通俗地说,就是支持插件模型。简化了运行时进行扩展这一问题的解决。
具体来说,MEF
(1)是宿主程序显化自身、揭示和曝光自已,为使用(或消费)外部扩展提供标准方式,而且对于扩展的互相依赖,则要做到正确组织、按正确的顺序将它们连接在一起;
(2)宿主程序定位和载入相关可行的扩展,发现机制的支持;
(3)允许使用额外的元数据以标记扩展,方便富查询和过滤。结构图如下。
怎么解决的?
核心是两块儿:目录表和容器。
目录表(catalog),用于发现扩展;
组合容器(CompositionContainer),协调实例创建并满足依赖关系。
最重要的类是哪个?
组合部件类(ComposablePart),有下列作用:
(1)组合部件类提供一至多个输出(Exports),当然后者也可能依赖到一至多个外部提供的服务或输入(Imports);
(2)组合部件类用来管理实例,MEF会缺省实现--给定类型(given type)的对象实例。只要遵循输入/输出合约,便一直支持可扩展可增添的组合部件实现;
(3)每个输入和输出都有合约(合约即输入和输出间的桥),输出合约可更进一步包括元数据,根据发现(discovery)再进行过滤。
(4)容器通过与栏目交互去访问组合部件。容器本身解决了部件的依赖性,并把输出显化到外部世界。如需要,可以直接向容器添加组合部件的实例。
(5)栏目返回组合部件,很可能会是程序的扩展。可能会有宿主程序所提供组件的输入(依赖),并且可能有其它的输出。
(6)组合部件实现,缺省地,使用基于特征的元数据,进行输入和输出声明。
小记:
微软重要的融合机制。