做ERP/MIS之類的軟件,通常會(huì)開發(fā)一些輔助工具來加速開發(fā),比如代碼生成器,數(shù)據(jù)字典生成工具。隨著時(shí)間的積累,這類小工具會(huì)越來越多,雖然開發(fā)的速度會(huì)快,方便,但是也會(huì)因?yàn)檎也坏剑缓貌檎疫@些小工具,產(chǎn)生麻煩。原因很簡單,已經(jīng)發(fā)了很多精力去做成了工具,自然就不會(huì)考慮用很原始的方式來完成任務(wù)。
舉例說明
對(duì)于插件式的開發(fā),我們通常會(huì)先做好界面功能,然后把這個(gè)功能添加到系統(tǒng)的功能列表中,以啟用功能,為完成這個(gè)目的,可以采用如下的SQL腳本來完成
INSERT System_Function(Module,Function,Description)
VALUES(‘Inventory’,'ICMISR’,'Inventory Receipt’)
這樣,就把新做好的進(jìn)倉單功能加到系統(tǒng)功能中,以啟用功能。
但情況通常沒有這樣簡單,通常還要設(shè)置有哪些用戶和角色有權(quán)限執(zhí)行進(jìn)倉功能,等等。
一種改善的辦法,是把這些功能都做成腳本文件,一次調(diào)用就完成功能增加,權(quán)限分配的任務(wù)
如上圖,就產(chǎn)生了這么一個(gè)小工具. 這是很簡化的情況。
我要講述的主題是,當(dāng)積累了很長時(shí)間,手頭有很多這樣的小工具,如何把它們整合到一個(gè)容器中,方便調(diào)用。
先看效果圖,邊看圖邊說
如圖所示,在這里,我集成諸多工具,比如
DataSet Reader 用于讀取dataset的工具
Translation 多國語言的翻譯工具,
StringBuilder 字符串構(gòu)造工具,例如,我想把SQL語句
SELECT FunctionCode FROM dbo.AuditTrail 轉(zhuǎn)化成字符串,以傳遞到SQL Server中
為了集成進(jìn)倉單的功能到這個(gè)工具中,需要如下處理
修改窗體的繼承基類為FormBase,給窗體類添加FunctionCode的特性,這個(gè)特性用于反射查找這里的窗體
修改ListItem.xml文件,增加一個(gè)Item項(xiàng),如圖所示
內(nèi)容是
<Item Index="10" Text="InventoryReceipt" Tag="Inventory Receipt" ImageIndex="35"></Item>
ListItem的內(nèi)容,就是效果圖中,要顯示在Task List任務(wù)框中的內(nèi)容,Text是標(biāo)題,Tag是功能的FunctionCode的值,ImageIndex是圖像的索引。
其實(shí),這里還可以做更多的控制。比如,如果沒有功能的源代碼,需要用反射的方式去call功能所在的程序集,為實(shí)現(xiàn)這個(gè)目的,還需要增加Item.Assembly以指向它所有的程序集;
如果功能的源代碼不是.NET代碼所寫,要支持Process.Start的方式啟動(dòng)工具,必要時(shí)還需要增加參數(shù)。
再進(jìn)入源代碼,看看這個(gè)工具是如何構(gòu)造的
MainForm是主窗體,這里采用的是Infragistics2.Win.UltraWinTabbedMdi組件,取代過時(shí)的MDI窗體組織形式,
NewProject是Task List任務(wù)窗體,這是功能顯示的集成項(xiàng)目,Ctrl+N啟動(dòng)這個(gè)窗體,ListItem.xml是它的配置項(xiàng)
主窗體中的其他菜單,均沒有使用
Startup是啟動(dòng)時(shí)顯示的主窗體,在這里,可以顯示一些常見工具的快捷方式
為了獲取和Office 2007一樣的藍(lán)色主題效果,可反注釋如下的代碼
ToolStripManager.Renderer = new WinUI.Misc.Office2007Renderer();
statusStrip.Renderer = new WinUI.Misc.Office2007Renderer();
菜單和狀態(tài)欄的效果如下圖
反射應(yīng)用于查找窗體的特性,找出它的定義,顯示出來,代碼框架如下
Assembly assembly = Assembly.GetExecutingAssembly();
object entryForm = Activator.CreateInstance(formBaseType) as Form;
entryForm .MdiParent = this;
entryForm .Show();
entryForm .Activate();
這便是這個(gè)工具,最有價(jià)值的內(nèi)容。也達(dá)到了開頭提出的效果,只開發(fā)功能和配置ListItem文件,確實(shí)達(dá)到插件的目的.
請(qǐng)到epn.codeplex.com上獲取最新的源代碼,請(qǐng)使用Visual Studio 2008編譯。