今天是2017-03-04,我1號辭職的,今天第4天沒上班了。在公司我工作也剛好5年了,這5年來換了幾個工作,但是中間沒有停留超過1個月的。我雖換工作頻繁,但是走的一直是技術路線,且都是C#桌面軟件開發。辭職的時候,我的理由是,我對業務根本沒興趣,走的就是技術路線,而公司還是傳統的軟件開發,技術上還是采用保守的態度。公司是做業績盈利的不可能讓程序猿自由的寫感興趣的代碼的。一個做delphi開發的項目經理帶C#團隊,一直強調快速開發,最后出的產品問題不斷,這種種的問題,只有在公司中存在。
閑話少扯,繼續說框架,上次的框架又經過我自己的不斷重構,加入了路由通信機制,多線程異步加載,同步控制,替換掉osgi加載程序集等功能。下面分別說明。
路由通信:程序集A中的a對象,想調用程序集B中的b對象,通過主界面去找b對象,而主界面是完全動態加載及動態控制的,主界面分模塊,插件,窗體。
a,b分別屬於不同模塊,不同插件的不同窗體,a怎么調用b直接在主界面上切換,而不是彈出窗體,這樣的機制就是路由通信,通信的意思就是需要傳遞參數。
a只用告訴主界面,我帶着參數信息需要找b,剩下的工作由主界面完成。字典是查找最快的數據結構,那就需要把b窗體的插件,模塊維護成字典。(主界面上所有的窗體對象都需要這樣的字典維護)。C#中的消息被封裝成事件了,所以需要把窗體的事件處理函數放在主界面那里管理,窗體a只用觸發事件,由訂閱的主界面去處理即可。參數為了統一,我采用的是dynamic對象,接收窗體再反射解析對象。
一個軟件從登錄到主界面,用戶肯定是不願意等待的,意思是進入主界面越快越好,但是主界面動態構建,邏輯數據復雜的話,肯定加載緩慢,且登錄邏輯也需要判斷很多條件,及整個系統的一些初始化工作。在登錄界面顯示前就開一個線程跑主界面的數據,在登錄界面出來后再跑一個線程取登錄界面的數據。登錄界面用this.Update()在shown事件中,意思是登錄界面立刻出現,然后跑登錄界面的數據。【還有一種辦法是發用戶消息,用戶消息會在一個線程上執行,在執行Load事件后,立刻更新界面this.Update(),再執行消息的處理過程。這樣可以把界面與加載分開處理。】在登錄成功后,再跑一個線程取一些緩存數據。
假如主界面出來后,如果開始跑主界面數據的線程還沒執行完,是需要同步控制的,當然C#的同步機制很多,我用的就是簡單的Lock。
說一下客戶端軟件的緩存機制,把不常變的數據放到本地json中,這樣可以直接取json而不用每次去服務端取。把一些長時間使用且在整個會話中不變的對象放到內存中,而不是每次都取服務器的數據。插件系統,是希望當更新的時候只用更新改變的dll,而不需要動其他程序集。首先說一下程序集的查找順序,1在GAC中找,2.codebase里找,3.根目錄中查找4.privatepath中查找。由於我設計那個系統界面上元素都可以在數據庫中配置,且屬於用戶的權限。所以也可以控制到插件。
最近我辭職前這一個月主要是搞熱插拔,使用的還是程序域的概念。代理代替真實的對象執行程序域內的操作,而程序域內使用反射進行不同程序集間的交互。感覺不像框架。這僅是我留下的測試代碼。
還是那句話,框架靠規則,業務靠要求。好的框架及代碼都是通過不停的重構完善的。
辭職了,只是在公司的碼農生活告一段落,而我會更加自由的研發自己感興趣的產品。
一個男人最重要的品質就是積極向上,路漫漫其修遠兮,吾將上下而求索!