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

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

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

      NVelocity實現違反了LSP法則,使我的一個低級錯誤排查了一個下午。

      最近我在做一個CMS系統,需要一個模板引擎,選擇了NVelocity,NVelocity是JAVA的開源模板引擎Velocity移植到了.NET平臺,這個不過多介紹。因為Velocity的模板語法很簡單我就選用了它作為我們CMS的模板引擎。NVelocity好像是Castle Project維護的,我在Castle Project的網站找到了入門文章,看上去是比較簡單的,很容易上手。然后我就照著他的例子編碼:


      var velocityEngine = new VelocityEngine();

      var props 
      = new ExtendedProperties();
      props.Add(RuntimeConstants.INPUT_ENCODING, 
      "utf-8");
      props.Add(RuntimeConstants.OUTPUT_ENCODING, 
      "utf-8");
      props.Add(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, targetViewFolder);
      velocityEngine.Init(props);

      props.Add那三句在例子中是沒有的,是我自作聰明加上去的,因為如果不傳入配置的話會按照NVelocity的默認配置,但是這么寫是錯的,為什么是錯的稍后告訴大家。

      這段代碼編譯過去了,然后運行到這里也沒有出問題,但是我在velocityEngine.GetTemplate的時候卻出了問題,報異常說找不到資源,經過斷點調試發現了詭異的地方

      為什么我的配置沒有生效,反而還是默認的設置?然后我又在網上找了一些例子,由于“老眼昏花”,并沒有看出到底錯在哪里,最后沒辦法我覺得需要追蹤一下NVelocity的源代碼,我在Castle Project的網站上下載整套源碼,其中有NVelocity的代碼,但是項目缺少directive.properties和nvelocity.properties連個文件,我先項目中去掉了這個文件,發現雖然可以順利編譯,但是在使用NVelocity的時候連默認配置都沒有了,我只好在已經編譯好的NVelocity.dll中取得了這個兩個文件(以前還不知道怎么取DLL中的資源文件,又研究了N久),最后編譯成功,單步調適,跟著Init(props)方法進去看個究竟,果然發現了奇怪的地方:

       

      p.Keys怎么可能一個元素都沒有?其實在監視props變量里面是有東東的,但是Keys里什么都沒有,然后我通過分析ExtendedProperties發現了原因:
      1)ExtendedProperties
      是繼承Hashtable的
      2)ExtendedProperties自己維護了Keys

      public new IEnumerable Keys
      {
          
      get { return keysAsListed; }
      }

       所以,Add方法是Hashtable本身實現的,在使用Add方法增加元素的時候,ExtendedProperties.Keys并沒有增加,應該使用擴展出來的AddProperty方法,執行AddProperty才會順便去維護keysAsListed,我修改初始化的代碼后發現一切正常了。后來我回頭去看網上的例子,都是使用AddProperty的,汗死!!!最后貼出正確的初始化代碼

      var velocityEngine = new VelocityEngine();

      var props 
      = new ExtendedProperties();
      props.AddProperty(RuntimeConstants.INPUT_ENCODING, 
      "utf-8");
      props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, 
      "utf-8");
      props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, targetViewFolder);
      velocityEngine.Init(props);

       

      不過這回老眼昏花也讓我理解了LSP法則,面向對象實踐中有一些法則,我往往是只知其然,不知其所以然,最后說說什么是LSP法則。:

      LSP: The Liskov substitution principle
      子類必須能夠替換基類。Subtypes must be substitutable  for their base types.

      ExtendedProperties繼承Hashtable,但是并不能夠代替基類,反而會導致行為不正常,讓我陷入歧途,一個低級的錯誤,一個下午的時間,不過總在下班前解決了。

      posted @ 2009-10-24 16:41  subwayline13  閱讀(974)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 亚洲第一香蕉视频啪啪爽| 国产精品国产高清国产av| 湘阴县| 亚洲一区二区三区十八禁| 久久国产免费观看精品3| 成人h动漫精品一区二区无码| 亚洲中文字幕无码爆乳app| 中文字幕无线码免费人妻| 久久国产精品成人免费| 日韩精品一区二区三区激| 国产成人午夜福利精品| 拜泉县| 精品在免费线中文字幕久久| 在线播放国产女同闺蜜| 在线精品国产中文字幕| 漂亮人妻被强中文字幕久久| 福利视频一区二区在线| 在线a亚洲v天堂网2018| 国产不卡一区二区在线| 延长县| 超碰成人人人做人人爽| 亚洲情综合五月天| 久久亚洲av成人无码软件| 国产亚洲精品黑人粗大精选| 亚洲精品在线少妇内射| 国产精品视频免费一区二区三区| 中文字幕亚洲人妻一区| 欲香欲色天天天综合和网| 国产精品无遮挡猛进猛出 | 亚洲国产高清精品线久久| 性色欲情网站iwww九文堂| 自拍偷拍另类三级三色四色| 四虎影视久久久免费| 日韩国产精品无码一区二区三区| 人人人澡人人肉久久精品| 中文字幕国产精品综合| 97视频精品全国免费观看| 亚洲综合久久一区二区三区| 人妻聚色窝窝人体WWW一区| 国产精品女人毛片在线看| 丰满人妻熟妇乱又伦精品软件|