首先申明:標題中的如果是可以去掉的。
想寫這篇文章很長時間了,一來是跟大家分享一下,別浪費時間在寫代碼生成器上面了,什么CodeSmith,XXCodeGenerator等等,都是浮雲;二來想跟大家交流交流已達到相互提高的目的。
這篇文章先不講如何實現,主要是講講思想,以及在實現過程中可能會碰到的一些問題:
1。每個人都寫過自己的代碼生成器,每個人都曾經為自己的代碼生成器自豪過,但是有一個缺點,就是代碼生成器都是為自己,或者為自己的團隊定制的,換一個人,或者換一個團隊環境,你的那個代碼生成器可能就廢了。
2。是否碰到過,每次你的生成的代碼都有一些不盡人意的時候(小問題如:一個字符的問題,字段,屬性擺放位置,代碼縮進等等,大問題如:增加一個方法),你都會打開你的代碼生成器源代碼,進行一些調整,然后重新編譯,ok,問題解決了,可是類似的情況可能會發生n多次。。。唉。。。
3。有沒有一個辦法可以解決在出現上述第二條中出現的問題,稍微調整一下模板,然后就可以了。方案當然有,現成的就有大把的基於模板的代碼生成器,如CodeSmith。
4。如果你是大牛的話,如果你因為用別人的代碼生成器而感到拘束,因為不是自家的東西不順暢,所以你想擁有自己代碼生成器,所有你開始了自己的代碼生成器的開發歷程,主要有下面幾種方式:
a).正則表達式查找替換(缺點:要寫很多正則表達式,比如,常量正則表達式,列表/列表項正則表達式);
b).基於xml文件方式,然后采用xmlDocument,XPath等方式加載,其實類似第一種,也是查找替換(這種相對第一種稍微好點,博客園中路過秋天大哥的秋色園的頁面html代碼就是通過這樣的方式實現的,至於難度,大家研究過的都知道有多么復雜了)
c).高級點,可能涉及到邏輯處理if else if else, for, foreach, while等等,這種需要話的時間可不是一點點,碰到的問題也是各種各樣的,稍微在博客園中搜索一下,就可以找到很多類似的文章
5。4中提到的三種代碼生成器都不是我要的,所以一直還是停留在自己為自己定制的代碼生成器上,沒增加一段內容,都需要修改源碼,編譯。。。。糾結。
6。一次偶然的機會,看到有人說了這么一句話:ASPX頁面上最好的代碼生成器,”誒,這個不錯哦“,周傑倫說過!但是如果要實現基於ASPX文件的代碼生成器,需要將aspx文件宿主在一個ApplicatioinHost中,才能夠被解析和訪問,一般有下面幾種方式:
a).IIS;
b).如果你沒有IIS你可以使用中安裝VisualStudio的時候自帶的WebDev.WebServer.exe中;
c).網上有個開源的項目,名字為:CassiniServer,可以將一個WebSite目錄發布成一個網站,可以讓你通過瀏覽器訪問;(另外,路過秋天大哥也參考這個寫了一個工具,名字為:IIS_V10,本來想個給地址下載的,可是上秋色園使用”找找看“功能搜索關鍵字“IIS_V10”居然找不到相關文章,看來秋天大哥需要看看你的“找找看“的bug了。)
d).寫自己的WebServer,寫一個WebServer可不是那么簡單的事情哦,雖然我也試過,但是卻以失敗告終,如果想嘗試的同學可以參考用C#開發自己的Web服務器 - 前端開發的日志 - 網易博客系列文章,雖然很難,但是還是可以學到很多東西的。
7。到這里我考慮放棄了,但是在我看到這篇文章(自己寫Web服務器(續) - 猴健居士 - 博客園)的時候,想我找到了解決方案了:下面這一句是核心代碼:
private AspxCreator _aspxHost = (AspxCreator)ApplicationHost.CreateApplicationHost(typeof(AspxCreator), "/",AppDomain.CurrentDomain.BaseDirectory);
如果覺得不夠,可以去仔細看看那篇文章。
總結:一路走來,真是花了不少力氣,碰了不少牆壁,雖然走了很多彎路,但是學到了不少東西,還是值得的,代碼實現尚在完善中,請大家期待!