前一段時間,有一個天真的想法。我想將一個Action或者Func傳輸到遠程機器上執行。有很多問題。委托執行的上下文怎么復制。開始是想將委托所在的DLL和引用的DLL一起傳輸到遠程機器上。這樣一來,上下文環境不就有了嗎。當然在GAC里的DLL就不用傳輸了,傳輸對象只限於自定義的DLL。可是這樣做十分的麻煩也沒有必要。后來在微軟成立基金會的那天,偶然看到了Roslyn。它可以將一段字符串解析,編譯。利用Rolyn的擴展,甚至可以直接執行一段字符串代碼。太神奇了。於是就有了下面這個項目的想法。首先,先給各位看張圖。看看我的大概思路。
- 首先,會發送一個消息對象到服務端監聽程序。這個對象里包含有任務ID、要被動態編譯的字符串代碼、及引用的程序集(GAC中的不再其中)、路由信息。目前所有任務都是統一的一種處理方式,將字符串代碼編譯生成DLL。保存到本地文件系統中,然后經過一些列管道中自定義模塊的處理。將任務信息最終分發到指定的進程中去處理。以后可能會添加其他的任務處理方式。比方說,不持久化生成DLL。直接將字符串代碼經過Roslyn和其擴展動態執行。也可以不經過路由平台將任務分發到指定的進程中。暫時沒有想到其他的。
- 其中應用到的設計理念有類似於Asp.Net路由機制、管道設計、對象池(每一個請求就會new一個RemoteTaskAppliction,為了減輕壓力,所以就有了對象池的設計。如果對象池中的對象超過了對象池最大容量,那么該請求就會排隊等待有對象被釋放到池中再進行處理。)、對於請求的隊列控制(和對象池搭配使用,只有當有空閑空對象可以進行處理的時候,才會將請求出隊)。類似於IHttpModule的實現(在整個RemoteTaskApplication的生命周期內,定義了一系列的事件可供自定義的Module注冊,達到對請求的控制。目前可能就有日志模塊、安全模塊)
這個項目還沒完全寫完。最后引用Github的一句話。Build software better, together。該項目,我已經放在github上。地址是 https://github.com/freestyleSago/RemoteTaskPlatform
這個項目呢,對我來說,它的鍛煉目的大於它的實際價值。所以也希望各位大神多多指點。蔣金楠(Artech)老師真是太牛了。多看他的文章,相信大家也會有收獲。目前Roslyn和C#6.0的資料都太少,不過我覺得,有了Roslyn就可以將C#變成腳本語言了。解析執行。也許意義不大,性能很差。但是很酷啊。也算是圓了我的一個夢啊,給你一段字符串,你就給我執行。