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

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

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

      FluentAPI --- 用C#寫的JS代碼生成器

            一接觸FluentAPI,就被它的流暢編碼和良好可讀性吸引,園子里有很多介紹FluentAPI的文章,我也忍不住把自己最近寫的一個小類庫放在這里來補充一下流暢API的應用場景。

            我寫這個小型的類庫來源于我昨天的發(fā)表的文章<asp.net webForm也可以這樣用Ajax -- My Ajax Framework>一文后面網(wǎng)友 “、Dark”對我的一個建議,是否可以用框架動態(tài)生成JS文件,這樣直接類似AjaxPro的方式,仔細考慮感覺是很好的建議,于是就寫了一下,結果發(fā)現(xiàn)向Response中寫入一些JS數(shù)據(jù)流是多么亂,又很容易出錯。

      我起初的代碼是這樣的:(為了生成一段Js代碼我這樣做):

      Response.Output.WriteLine("<script>");
      Response.Output.WriteLine("var PowerAjax = function () { };");
      Response.Output.WriteLine("PowerAjax.__Private = function () { };");
      Response.Output.WriteLine("PowerAjax.AsyncAjax = function (methodName, paramArray, success, failure) { PowerAjax.__Private.Ajax(methodName, paramArray, success, failure, true);}");
      Response.Output.WriteLine("PowerAjax.SyncAjax = function (methodName, paramArray, success, failure) { PowerAjax.__Private.Ajax(methodName, paramArray, success, failure, false); };");
      Response.Output.WriteLine("PowerAjax.__Private.Ajax = function(methodName, paramArray, success, failure,isAsync) {");
      Response.Output.WriteLine(" var data = {};");
      Response.Output.WriteLine(" switch (paramArray.length) {");
      Response.Output.WriteLine(" case 0:data = { 'isAjaxRequest': true, 'MethodName': methodName };break;");
      Response.Output.WriteLine(" case 1:data = { 'isAjaxRequest': true, 'MethodName': methodName, 'param0': paramArray[0] }; break;");
      Response.Output.WriteLine(" }");
      Response.Output.WriteLine(" var url = document.location.href;");
      Response.Output.WriteLine("};");
      Response.Write("</script>");

      感覺這樣太不靠譜了,經(jīng)常性的就會寫錯了,尤其是對于 “{" 和 ”}“這兩個符號的對應,實在糾結,一個不留神不是忘記{就是忘記},結果會導致Javascript根本無法打開。有些語句還經(jīng)常忘記加一個“;”,那么就因為語句的這一個小“;”,代碼就無法執(zhí)行。

      于是我就做了一個簡單的改進,寫了一個簡單的小類庫來生成:

      我的想法是:  把所有js代碼分為兩類 ”一般語句“ 和 ”由“{.......}”組成的兩種語句, 大括號里可以繼續(xù)寫一般語句和{.....} 。就好比函數(shù)里可以繼續(xù)套N個函數(shù)和N條語句,于是就有了以下API。

      先看看改善之后的代碼是什么樣的:

      ScriptFactory.CreateScript(
                          new ScriptSentence("var PowerAjax = function () { }"),
                          new ScriptSentence("PowerAjax.__Private = function () { }"),
                          new ScriptContainer("PowerAjax.AsyncAjax = function (methodName, paramArray, success, failure)",
                              new ScriptSentence("PowerAjax.__Private.Ajax(methodName, paramArray, success, failure, true)")),
                          new ScriptContainer("PowerAjax.SyncAjax = function (methodName, paramArray, success, failure)",
                              new ScriptSentence("PowerAjax.__Private.Ajax(methodName, paramArray, success, failure, false)")),
                          new ScriptContainer("PowerAjax.__Private.Ajax = function(methodName, paramArray, success, failure,isAsync)",
                              new ScriptSentence("var data = {}"),
                              new ScriptContainer("switch (paramArray.length)",
                                  new ScriptSentence("case 0:data = { 'isAjaxRequest': true, 'MethodName': methodName };break"),
                                  new ScriptSentence("case 1:data = { 'isAjaxRequest': true, 'MethodName': methodName, 'param0': paramArray[0] }; break"),new ScriptSentence("var url = document.location.href"))));

           有感覺好看一些嗎?主要是現(xiàn)在所有的語句我都不需要管;,也不需要加個什么{和}的對應關系了。

           敏銳的朋友可能已經(jīng)感覺到,這種API正是LinqToXML生成一段XML一樣類似的代碼,如:

       XDocument doc = new XDocument(
                      new XDeclaration("1.0", "utf-8", "yes"),
                      new XElement("xxxConfig",
                          new XElement("a", s_LDAPEnabled),
                          new XElement("b", s_ServerPath),
                          new XElement("c", s_BaseDN),
                          new XElement("d", s_UserCN)));

      這種結構的優(yōu)勢:不容易出錯,寫起來很舒服,排版很嚴謹,很容易就容易從代碼中看出整個文檔的結構特點。同樣我的輸出的JS代碼也能很清晰的看出這個在C#的中生成的JS文件是什么樣子的?

      演示就到這里,把整個API發(fā)出來,大家互相學習:

      ********ScriptFactory類********

      目的:方便前臺調用。因為本身加載起來的是一個樹形的結構,所以需要使用遞歸來解析數(shù)據(jù),生成JS代碼。

          public sealed class ScriptFactory
          {
              private static string CreateScriptTrue(params IScriptBase[] scriptBases)
              {
                  StringBuilder sb = new StringBuilder();
                  foreach (var scriptBase in scriptBases)
                  {
                      if (scriptBase is ScriptSentence)
                      {
                          sb.Append(scriptBase.ScriptContent + ";");
                      }
                      if (scriptBase is ScriptContainer)
                      {
                          sb.Append(scriptBase.ScriptContent);
                          sb.Append("{");
                          sb.Append(CreateScriptTrue(((ScriptContainer)scriptBase).Children.ToArray())); // 遞歸調用生成JS樹形結構
                          sb.Append("};");
                      }
                  }
                  return sb.ToString();
              }
              public static string CreateScript(params IScriptBase[] scriptBases)
              {
                  return string.Format("<script>{0}</script>",ScriptFactory.CreateScriptTrue(scriptBases));
              }
          }

      ********IScriptBase接口********

      目的:提供內容規(guī)范

          public interface IScriptBase
          {
              string ScriptContent { get; set; }
          }

      ********ScriptContainer : IScriptBase********

      目的:承載包含{}結構的語句,{}中還可能包含語句和各種,所以會有一個m_ScriptBases來保存所有結構

          public sealed class ScriptContainer : IScriptBase
          {
              private List<IScriptBase> m_ScriptBases = new List<IScriptBase>();
      
              public IEnumerable<IScriptBase> Children
              {
                  get { return this.m_ScriptBases; }
              }
      
              public string ScriptContent { get; set; }
      
              public ScriptContainer(string content, params IScriptBase[] scriptBeses)
              {
                  this.ScriptContent = content;
                  this.m_ScriptBse = scriptBeses.ToList();
              }
          }

       

      ********Scriptesentence : IScriptBase********

      目的:承載一般性質的語句,語句本身內部不具備數(shù)據(jù)結構,僅僅是內容而已。

          public sealed class ScriptSentence : IScriptBase
          {
              public string ScriptContent { get; set; }
              public ScriptSentence(string content)
              {
                  this.ScriptContent = content;
              }
          }

      OK,以上就是全部代碼,是不是很簡單呢?而代碼有極為簡單呢?

      此API要點:接口繼承,params用法,樹形結構,遞歸。請注意構造函數(shù)中參數(shù)的用法,這個流暢API的秘密就在這里(大牛可以繞過了,呵呵)

       

      以上是試水的東西,意在演示這種類LinqToXML生成方式的流暢API,如果有什么不對的地方請各位指正,很感謝。從上一篇文章中,各位的指正讓我明白了很多東西,拋磚引玉了。

      如果感覺此文對您有幫助,請頂一下了^_^

      posted @ 2013-03-29 15:18  純粹的郭子  閱讀(3332)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 亚洲乱理伦片在线观看中字| 久爱www人成免费网站| 亚洲第一无码专区天堂| 光棍天堂在线手机播放免费| 色综合色综合色综合频道| 麻豆亚州无矿码专区视频| 亚洲av影院一区二区三区| 欧美成人精品三级网站视频| 狠狠色狠狠色综合| 日韩成人高精品一区二区| 免费费很色大片欧一二区| 国产激情国产精品久久源| 激情综合网激情国产av| 久久一区二区中文字幕| 性色av不卡一区二区三区| 亚洲一区二区乱码精品| 国产精品不卡一区二区在线| 深夜视频国产在线观看| 高清自拍亚洲精品二区| 无码AV中文字幕久久专区| 免费人成视频在线| 国产成人综合色就色综合| 亚洲欧美日本久久网站| 精品国产亚洲第一区二区三区| 亚洲国产成人精品av区按摩| 日韩一区二区三在线观看| 耒阳市| 麻豆a级片| 久久久久久久久毛片精品| 午夜免费国产体验区免费的| 亚洲国产超清无码专区| 成人午夜免费无码视频在线观看 | 性姿势真人免费视频放| 欧美一级高清片久久99| 亚洲AV日韩AV综合在线观看 | 日韩人妻系列无码专区| 18禁一区二区每日更新| 狠狠色噜噜狠狠狠狠av不卡| 色老99久久精品偷偷鲁| 柳州市| 亚洲中文字幕人妻系列|