(最終所產生的目的結果:將資料庫的Table資料,產生對應的Class資料) 註:因table資訊未補齊,所以結果圖才會小怪怪的。
目標
依所取得的 Database Table 下的Columns資訊,可以依 「Template」的定義,決定其 Render出來的Class樣式。
此篇重點:
■ 目標是要能夠讀Template定義資訊,然後產生對應的Code Result。
■ 使用「DotLiquid」的Framework,以及所遇到的問題及心得!(真出呼我意料之外)
■ 此篇思考了:如何不動到原Model,又可以應用至DocLiquid當參數的方式。
■ DotLiquid它是無法直接使用即有的Model類別物件的,最終都會是使用 Anonymous Class (匿名物件)
http://bit.ly/2RNhQWt (官方說明)
註:實作 ILiquidizable的函式,最後也是回傳 匿名物件的。
彙整相關資源:
■ Liquid 語法的官方說明 (DotLiquid為實作能讀取該類Template 的Framework)
■ DotLiquid的官方網站 、DotLiquid的 GitHub資訊 、它的Wiki資料(那幾篇都要看)
■ DotLiquid的 Template官方測試案例 (使用Sample)
■ Dot Liquid Template Implementation in C# and MVC
>>我並非用此篇內容,僅是參考別人的寫法如何寫 Dot Liquid的程式碼。
最終程式碼模樣:
定義的Liquid樣版資料:
- {%- -%} 多一個「-」號的用意,是Render時不讓它多占一行空白資料 (官方語法說明:http://bit.ly/2RIUWzh )
實作出DotLiquid實務上應用的程式碼:
- 讀取特定的樣版資料。
- Template Parse 該資料內容,建立起 Liquid Template。
- 使用 Liquid 可以用的Model:實作 Liquidizable。
- 若要透過Object,最後一定都是要呼叫:Hash.FromAnonymoutObject。
最終使用的Model模式:(採用繼承原Model後去實作ILiquidizable)
>>這最後也是回傳「匿名物件」出去。 (這邊即是定義Liquid Template可使用的參數)
遇到的問題:
錯誤一:Liquid syntax error: Object 'CodeGen.Web.Models.TableInfo' is invalid because it is neither a built-in type nor implements ILiquidizable
這就是「TableInfo」對DotLiquid來說,不是匿名物件型別 (實作ILiquidizable的程式可參考上面)
而加上 Template.RegisterSafeType 的方式,它也是要明確宣告要那一個 Property Name,所以我實務上不這樣做。
錯誤二:Missing property. Did you mean 'column_description'?
它不是Exception,而是在Render時,它認不得所用的屬性,
最終就是 上述程式的寫法 解掉這問題。
總之,它Render可讀的參數類型,以C#來說就是 Anonymous Type 的資訊了,(且還不能讀Json資料當參數……)
個人學習過程心得:
1.
過程中,使用 Dot Liquid的方式,真的概念和我不一樣。
原以為,就是傳入 DataModel,及使用對應的Template,它就可以Render出我要的資訊出來。
但……就是不能使用原生的DataModel,要變成用匿名物件、或是實作他的ILiquidizable 介面。
2.
網站上的資訊,很少有寫DotLiquid的使用方式,
這次就 嘗試出 這樣的寫法架構,不要修改到原生的Model,而可以當DotLiquid的參數使用。
而看官網的 「單元測試」,看看他們怎麼寫,也是不錯的經驗
(THE END)
0 意見 :
張貼留言