<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      模版引擎XTemplate與代碼生成器XCoder(源碼)

          模版引擎XTemplate是一個(gè)仿T4設(shè)計(jì)的引擎,功能上基本與T4一致(模版語(yǔ)法上完全兼容T4,模版頭指令部分兼容)。

          自己設(shè)計(jì)模版引擎,就是為了代碼生成器、網(wǎng)站模版、郵件模版等多種場(chǎng)合,也就是要能拿出來(lái)單獨(dú)使用、功能強(qiáng)大并且容易控制的。T4是個(gè)很好的引擎,但是它的設(shè)計(jì)基本上傾向于vs,幾乎不顧別的場(chǎng)合。

          XTemplate特點(diǎn)如下:

          1,完全使用C#作為模版語(yǔ)言。跟ASP、ASP.Net頁(yè)面的解析一樣,把<##>標(biāo)簽外的文本內(nèi)容當(dāng)作字符串,用一個(gè)StringBuilder,標(biāo)簽內(nèi)作為C#原生代碼,拼在一起編譯,進(jìn)行模版替換時(shí),實(shí)質(zhì)上就是執(zhí)行編譯后的程序集,這就是XTemplate的核心原理!網(wǎng)絡(luò)上現(xiàn)有的許許多多模版引擎,要么采用標(biāo)簽替換,要么自創(chuàng)模版語(yǔ)言,這些都增加了使用者的學(xué)習(xí)難度。XTemplate使用C#作為模版語(yǔ)言,這個(gè)世界安靜了!

          2,支持“調(diào)試”。不是運(yùn)行時(shí)調(diào)試,而是XTemplate能夠把模版編譯的中間類(lèi)文件以及程序集等輸出,方便檢查錯(cuò)誤。如果把模版編譯后的程序集保存下來(lái),可以在沒(méi)有模版文件的情況下直接使用模版功能。

          3,不需要ASP.Net支持。有部分模版引擎,是模擬一個(gè)ASP.Net服務(wù)器,然后以ASP.Net作為模版來(lái)實(shí)現(xiàn),這就要求有一個(gè)ASP.Net服務(wù)器作為宿主,限制了模版引擎的使用范圍。

          4,支持批量編譯。可以把多個(gè)模版放入模版處理器,進(jìn)行一次編譯(所有模版類(lèi)都編譯到一個(gè)程序集里面去)。

          5,支持類(lèi)成員。模版內(nèi)容默認(rèn)情況下將會(huì)統(tǒng)一編譯到一個(gè)類(lèi)的Render方法里面去,但是有時(shí)候我們需要給這個(gè)類(lèi)增加一些屬性和方法,此時(shí)可以使用<#! #>標(biāo)簽,序數(shù)為單數(shù)表示開(kāi)始,序數(shù)為偶數(shù)表示結(jié)束,所以不限制類(lèi)成員代碼的位置(T4要求只能寫(xiě)在模版的最后面)。

          6,支持自定義基類(lèi)。默認(rèn)情況下,所有編譯生成的模版類(lèi)都繼承自TemplateBase,你也可以創(chuàng)建自己的模版基類(lèi),然后在模版頭通過(guò)指令,或者通過(guò)外部宿主指定自定義的模版基類(lèi),模版中可以直接使用自定義模版基類(lèi)的成員(因?yàn)槔^承嘛),比如代碼生成器XCoder中的XCoderBase。

          7,自動(dòng)引用宿主程序集。T4在使用上最大的麻煩就是引用外部程序集和命名空間,畢竟不是在vs里面編寫(xiě)C#代碼。XTemplate在編譯的時(shí)候,自動(dòng)引用宿主(就是調(diào)用者,比如XCoder)的所有應(yīng)用程序集,同時(shí)引用大部分常用的明明空間,因?yàn)檫@樣,生成的類(lèi)很臃腫,但是編譯的時(shí)候,編譯器會(huì)自動(dòng)去掉無(wú)用的引用。XTemplate從完成到現(xiàn)在為止,還沒(méi)有用過(guò)引用程序集和命名空間的問(wèn)題,因?yàn)橐话銇?lái)說(shuō),模版中需要用到的程序集,宿主里面一般都有用到,非常符合我們的使用習(xí)慣。

          8,與宿主的良好交互。在XTemplate中,編譯的模版程序集是直接加載在默認(rèn)域,這點(diǎn)與T4不同,T4會(huì)新建一個(gè)域,應(yīng)該是為了防止模版代碼弄臟默認(rèn)域的數(shù)據(jù)吧(比如干擾vs運(yùn)行)。因?yàn)樵谕粋€(gè)域,XTemplate與宿主進(jìn)行交互,就不需要“FQ”(跨域)了。XTemplate的處理過(guò)程分為分析、編譯和執(zhí)行三步,都可以由外部控制,比如有時(shí)候我們只是需要檢查一下模版的語(yǔ)法,只需要檢查一下模版語(yǔ)法是否正確,這個(gè)時(shí)候編譯一下就可以了。

          9,更多的特點(diǎn)需要大家來(lái)發(fā)現(xiàn)!

       

          XCoder使用XTemplate代碼(后面有XCoder的項(xiàng)目代碼):

      Dictionary<String, Object> data = new Dictionary<string, object>();
      data["Config"] = Config;
      data["Tables"] = Tables;
      data["Table"] = table;
      
      // 聲明模版引擎
      Template tt = new Template();
      Template.Debug = Config.Debug;
      foreach (String item in ss)
      {
          if (item.EndsWith("scc", StringComparison.Ordinal)) continue;
      
          String tempFile = item;
          if (!Path.IsPathRooted(tempFile) && !tempFile.StartsWith(TemplatePath, StringComparison.OrdinalIgnoreCase))
              tempFile = Path.Combine(TemplatePath, tempFile);
      
          String content = File.ReadAllText(tempFile);
      
          // 添加文件頭
          if (Config.UseHeadTemplate && !String.IsNullOrEmpty(Config.HeadTemplate))
              content = Config.HeadTemplate + content;
      
          tt.AddTemplateItem(item, content);
      }
      tt.Process();
      
      // 編譯模版
      tt.Compile();
      
      List<String> rs = new List<string>();
      foreach (String item in ss)
      {
          if (item.EndsWith("scc", StringComparison.Ordinal)) continue;
      
          //String content = RenderFile(table, item, data);
          String content = tt.Render(item, data);
      
          // 計(jì)算輸出文件名
          String fileName = Path.GetFileName(item);
          String className = CutPrefix(table.Name);
          className = FixWord(className);
          String remark = table.Description;
          if (String.IsNullOrEmpty(remark)) remark = ENameToCName(className);
          if (Config.UseCNFileName && !String.IsNullOrEmpty(remark)) className = remark;
          fileName = fileName.Replace("類(lèi)名", className).Replace("類(lèi)說(shuō)明", remark).Replace("連接名", Config.EntityConnName);
      
          fileName = Path.Combine(OuputPath, fileName);
          File.WriteAllText(fileName, content, Encoding.UTF8);
      
          rs.Add(content);
      }
      

       

          XTemplate設(shè)計(jì)圖(我喜歡先做圖再編碼):

      XTemplate架構(gòu)

      posted @ 2010-11-10 11:23  大石頭  閱讀(9676)  評(píng)論(40)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产麻豆成人传媒免费观看| 色伦专区97中文字幕| 色av专区无码影音先锋| 亚洲第一综合天堂另类专| 少妇上班人妻精品偷人| 亚洲色一色噜一噜噜噜| 天堂…中文在线最新版在线 | 亚洲精品日韩在线观看| 亚洲小说乱欧美另类| 亚洲欧美日韩国产精品专区| 成午夜福利人试看120秒| 国产在线精品一区二区中文| 亚洲精品天堂在线观看| 宣威市| 日韩精品 在线 国产 丝袜| 素人视频亚洲十一十二区| 日本高清日本在线免费| 岛国岛国免费v片在线观看| 日本极品少妇videossexhd| 把女人弄爽大黄A大片片| 孕妇特级毛片ww无码内射| 摸丰满大乳奶水www免费| 国产av国片精品一区二区| 一边捏奶头一边高潮视频| 亚洲日本韩国欧美云霸高清| 日本高清视频网站www| 国产毛1卡2卡3卡4卡免费观看| 国产在线一区二区不卡| 男女猛烈激情xx00免费视频| 国产精品成人无码久久久| 国产亚洲AV电影院之毛片| 中文字幕日韩精品亚洲一区| 亚洲精品国自产拍影院| 亚洲av永久一区二区| 国产自在自线午夜精品| 色老99久久精品偷偷鲁| 酒泉市| 精品国产一区av天美传媒| 久久这里都是精品二| 亚洲中文字幕第一页在线| 久久夜色撩人精品国产av|