做ERP/MIS之类的软件,通常会开发一些辅助工具来加速开发,比如代码生成器,数据 字典生成工具。随着时间的积累,这类小工具会越来越多,虽然开发的速度会快,方便,但是也会因为找不到,不好查找这些小工具,产生麻烦。原因很简单,已经 发了很多精力去做成了工具,自然就不会考虑用很原始的方式来完成任务。
举例说明
对于插件式的开发,我们通常会先做好界面功能,然后把这个功能添加到系统的功能列表中,以启用功能,为完成这个目的,可以采用如下的SQL脚本来完成
INSERT System_Function(Module,Function,Description)
VALUES(‘Inventory’,'ICMISR’,'Inventory Receipt’)
这样,就把新做好的进仓单功能加到系统功能中,以启用功能。
但情况通常没有这样简单,通常还要设置有哪些用户和角色有权限执行进仓功能,等等。
一种改善的办法,是把这些功能都做成脚本文件,一次调用就完成功能增加,权限分配的任务
如上图,就产生了这么一个小工具. 这是很简化的情况。
我要讲述的主题是,当积累了很长时间,手头有很多这样的小工具,如何把它们整合到一个容器中,方便调用。
如图所示,在这里,我集成诸多工具,比如
DataSet Reader 用于读取dataset的工具
Translation 多国语言的翻译工具,
StringBuilder 字符串构造工具,例如,我想把SQL语句
SELECT FunctionCode FROM dbo.AuditTrail 转化成字符串,以传递到SQL Server中
修改窗体的继承基类为FormBase,给窗体类添加FunctionCode的特性,这个特性用于反射查找这里的窗体
修改ListItem.xml文件,增加一个Item项,如图所示
内容是
<Item Index="10" Text="InventoryReceipt" Tag="Inventory Receipt" ImageIndex="35"></Item>
ListItem的内容,就是效果图中,要显示在Task List任务框中的内容,Text是标题,Tag是功能的FunctionCode的值,ImageIndex是图像的索引。
其实,这里还可以做更多的控制。比如,如果没有功能的源代码,需要用反射的方式去call功能所在的程序集,为实现这个目的,还需要增加Item.Assembly以指向它所有的程序集;
如果功能的源代码不是.NET代码所写,要支持Process.Start的方式启动工具,必要时还需要增加参数。
再进入源代码,看看这个工具是如何构造的
MainForm是主窗体,这里采用的是Infragistics2.Win.UltraWinTabbedMdi组件,取代过时的MDI窗体组织形式,
NewProject是Task List任务窗体,这是功能显示的集成项目,Ctrl+N启动这个窗体,ListItem.xml是它的配置项
主窗体中的其他菜单,均没有使用
Startup是启动时显示的主窗体,在这里,可以显示一些常见工具的快捷方式
为了获取和Office 2007一样的蓝色主题效果,可反注释如下的代码
ToolStripManager.Renderer = new WinUI.Misc.Office2007Renderer();
statusStrip.Renderer = new WinUI.Misc.Office2007Renderer();
菜单和状态栏的效果如下图
反射应用于查找窗体的特性,找出它的定义,显示出来,代码框架如下
Assembly assembly = Assembly.GetExecutingAssembly();
object entryForm = Activator.CreateInstance(formBaseType) as Form;
entryForm .MdiParent = this;
entryForm .Show();
entryForm .Activate();
这便是这个工具,最有价值的内容。也达到了开头提出的效果,只开发功能和配置ListItem文件,确实达到插件的目的.
请到epn.codeplex.com上获取最新的源代码,请使用Visual Studio 2008编译。
因图中提及的部分插件工具已经应用到实际生产中,恕不提供源代码下载。