這個問題看起來很簡單,實際做的時候碰到很多問題:
1. 怎麼判斷命令的響應結束?
最開始就是簡單的在迴圈中判斷NetworkStream.DataAvailable,如果沒有了就結束讀取。
最初的時候運行還可以,只是偶爾出些莫名其妙的響應,並且很少出錯。
後來測試internet上的伺服器,問題出來了。幾乎沒有一個正確返回。最好的情況不過是讀回了echo。
看樣應該等遠程伺服器響應結束,但是怎麼判斷響應結束呢?如果網路不痛快,一個位元組一個位元組的返回資料,該怎麼判斷?後來決定,對每個響應都去判斷它是否完全返回命令結果。即使出錯,也要判斷有完整的出錯資訊才算完事。
2. 事情又來了,每個命令有不同的返回結果,怎麼判斷響應正確?
有些時候結果的行數都不確定。而且有些操作結果是在中間,出現了這個標誌行,並不說明命令結束,可能後面的結果還沒回來呢!
最後發現反向推算法比較合適。就是倒數N行,應該是我要的正確操作提示。或者倒數M行,是錯誤提示。
這樣可以確保後面的行數都已經返回,避免和下個命令的結果混淆在一起。
3. 怎樣判斷指定行是否需要的資訊?
開始用string比較。後來發現Telnet伺服器也很聰明,經常會返回一些動態東西。後來用Regex,犧牲了一點效率。
4. 事務
Telnet要和資料庫聯合操作,操作要同步。這個比較簡單,在事務中先操作資料庫,再操作telnet, 出錯了Rollback資料庫事務。Telnet多個步驟之間沒有事務了
5. 測試
寫後台模組,沒有Main方法。用Nunit再方便不過了。
用JGTM提到的編譯後事件檢查編譯結果,調試用調試的啟動程式。還用過hbifts最佳化過的外掛程式,用的不多,有前面兩種方式已經差不多了。
一開始把測試代碼和類寫在一起,甚至是一個類裡面,有些偷懶。後來在重構的時候,這些散落的測試代碼成了絆腳石,失敗的嘗試。有人反應運行AOP的代碼需要nunit模組,對於使用者會比較頭痛。
後來單獨分離出來一個測試Project, 而且測試代碼中,並不是對每個方法都去測試,因為有些測試會調用相關模組。也許這種測試不能算是完全的測試,對我來說,有點象調試工具和重構的Assert。
nunit裡面有個[Ignore(“Passed“)]標記很好用,測試過的類為了節省時間,可以把整個TestFixture忽略掉。
6. AOP
因為是業務模組,CBO AOP就發揮了一點小作用。記得以前在Java下面操作事務要寫很多try..catch..finally..用EJB又要做複雜配置。現在解放了,基本上配置幾個Attribute就搞定了。基本上可以專註於商務邏輯了。