概述
上一篇介绍了MEF的一个很简单很基本的应用,实现了MEF框架并展示了MEF框架的一些基本的要求和设置,这些基础知识很重要,接下来我们分析一下如何扩展或增强MEF框架内容。
增强的Contract类库
其实有了上篇的介绍,读者很快会发现,Contract类库制约性很强,或者说“它”只引用了windows自带的System.XXX类型的公共类库,而往往在协议中我们是要引用我们实际项目工程中的方法和成员,这样就导致了要依赖一个非系统的公共类库,例如Practise_MEF.Core。那能否还能实现,我的插件仅仅生成一个“类库DLL”呢?
首先我们来看一下依赖性图解:
这里所有项目工程都将依赖于Core,这其中Practise_MEF和Practise_MEF.contract是直接引用(Copy Local = true),Practise_MEF.Plugin.MultiCalculateEx是间接引用(Copy Local = false),这里CalculateEx这个项目没有引用Core,如果引用的话也为间接引用。扩展库通过间接引用后将不产生或复制Core.DLL,而是依赖于宿主(一般指调用扩展类库的UI类库,这里是Practise_MEF),这样插件类库只会产生本身类库的DLL而不会产生引用的DLL,至少看起来比较工整。
项目重构
有了上面这些技术上的铺垫,我们就为重构为MEF架构的软件提供了一条光明的道路。然而,道路永远是曲折的。
首先,既然框架式基于协议的,那就得分析要重构的项目中哪些是公共的属性、方法,以便提取出接口,这是至关重要的,如果没有共性,那重构本身的意义并不是很大。
在整理、提取项目核心类库的过程中,我认为一下几个方面值得提出到Core中:
- BaseForm
- 基础的Module/Entity/Objects
- 接口Interface
- 枚举Enum
- 委托Delegate
- 工具类Utility
- 基础方法Fucntion
。。。
其它,业务逻辑、非基础方法则提取到BLL等上层模块中。
Docker框架
在Winform下推荐WeifenLuo的DockPanel插件,这个插件实现起来简单方便、功能强大,可以将插件的Form作为Docker的一个子集加入其中,布局上类似于Visual Studio 编辑器。
介绍WeifenLuo:
http://www.cnblogs.com/wuhuacong/archive/2009/07/09/1520082.html
总结
有了以上三个方面的积累,使得重构成为MEF插件框架成为可能。
由于此项目尚在开中,故相关代码不宜公开。