按耐不住激動的心情,因為繼上篇文章后,不斷的完善框架,今天終於整個系統基本穩定了,就繼續談框架。
我做C#開發已經近五年了。已經愛上她了,我經常開玩笑說,寫代碼如同談戀愛,關鍵是我想認真的做一名程序員而不是碼農。
簡單回顧一下,目前系統是WCF三層C/S插件系統。服務器端是WCF程序寄宿在IIS中,其中我的配置設計是長連接,客戶端支持多線程,一個volatile的實例對象。客戶端用Winform,其中客戶端框架及規則及核心代碼都是我實現編寫的,顧今天只談客戶端。
什么是插件框架?一個插件是業務上可划分的模塊,代碼布局上是一個程序集,(當然構件系統可以對應多個程序集)。框架的作用是把程序集加載到內存,及負責程序集中的功能的路由通信。
現在的系統是使用osgi把程序集加載到內容中,因為僅是使用此功能,所以完全可以用C#中的反射程序集加載到內存,注意用LoadFile方法。
目前關於框架所設計的表有模塊表,插件表,窗體表,元素表。
主界面(框架的控制中心)設計界面只有幾個容器,其他全是動態生成的(模塊,插件,窗體)。
說說路由通信規則吧,什么叫路由通信呢?程序跑起來之后所有的功能都加載到主界面了。而每個模塊中的插件在不同的程序集中,(界面主要是動態生成的),怎么能實現從一個插件中的某個窗體跳轉到主界面任意一個插件中的窗體上且帶着參數傳過去呢?
這就是路由通信規則,首先界面上的窗體都繼承一個基類,這樣我可以在基類中定義一個事件,如果在窗體中激活這個事件必須通知主界面,然后在主界面中需找要跳轉的窗體。想到查找應該立馬想到字典,但是字典中的值不能是一個簡單的對象,必須包括模塊,插件,窗體。怎么把附帶的參數傳給要跳轉的窗體呢?應想到object類,我用的是dynamic定義(實際也是object),實參主要用匿名類對象(方便構造參數)。找到要跳轉的窗體后怎么解析參數呢?我主要用反射解析對象中的屬性。
再說說我這個系統中的權限吧,權限主要是界面上控件是否顯示,是否啟用。目前我是把界面上元素分類后存在不同的表中,然后把這些表構建成權限樹,然后在用戶權限那里給用戶分配權限。
框架主要的已經說完了,在winform中如果用原生的控件肯定滿足不了某些界面風格或功能,這樣就需要做用戶控件或擴展控件了。改變控件風格主要是重繪控件,控件的真正激活者是鼠標或鍵盤的那幾個事件,來通知操作系統,操作系統再發消息到我們的應用系統,然后攔截編寫處理函數實現我們的功能。
其實asp.net就是一個插件框架,它管理着我們的web應用程序。(后續我會再寫一遍Web應用程序的核心功能)。
程序員最重要的就是編程思想和工作中的悟性。我偶爾還在看C語言,雖然用不上,但是我是通過C思考C#深入編程思想。
我是大專軟件技術專業,2011年就考了國家軟考中級職稱。現在培訓機構多如毛,你是否喜歡編程,是否可以一坐一天呢?是否可以堅持五年以上?別聽說程序員工資高,想清楚再入行。
再次補充一下,新的應用系統一定重視pdm數據庫模型,保證一直都是最新最完整的數據結構,如果想在新系統中立足,一定要控制系統的核心功能,框架,及規則(框架設計師玩的就是規則,業務是定要求不要強迫其他程序員)。代碼生成規則主要是靠pdm完成的。
程序員不喜歡別人管着,對一個自覺的程序員,被人管着是不能發揮創造性的。我做這個新系統,當時也是破斧成舟,在老系統之中,和直接領導意見不統一(某些40多歲的程序員不學新技術總是夜郎自大,如果大boss再不懂技術,那這家公司會埋沒很多人才,建議大boss直接管理核心的程序員像直轄市一樣),我當時說如果這個系統做不出來,我直接辭職(也是經歷了很多艱辛的日日夜夜,完事開頭難嘛)。
寫的有些亂,最后一句,你努力的時候一定要告訴自己有個人在看着你,那個人就是未來的自己。想成為技術大神的路還有很遠,我們只有沉下心做苦行僧。
----紀念孤獨的日子。
----苦行僧
