2018/11/09

20181109-程式-C# 使用 DotLiquid 透過Template定義產生 其程式碼資料

SNAGHTML57880445

(最終所產生的目的結果:將資料庫的Table資料,產生對應的Class資料)  註:因table資訊未補齊,所以結果圖才會小怪怪的。


目標

依所取得的 Database Table 下的Columns資訊,可以依 「Template」的定義,決定其 Render出來的Class樣式。


此篇重點:


■    目標是要能夠讀Template定義資訊,然後產生對應的Code Result。

■    使用「DotLiquid」的Framework,以及所遇到的問題及心得!(真出呼我意料之外)

■    此篇思考了:如何不動到原Model,又可以應用至DocLiquid當參數的方式。

■    DotLiquid它是無法直接使用即有的Model類別物件的,最終都會是使用 Anonymous Class (匿名物件)

http://bit.ly/2RNhQWt (官方說明)

clip_image001

註:實作 ILiquidizable的函式,最後也是回傳 匿名物件的。



彙整相關資源:

■    Liquid 語法的官方說明  (DotLiquid為實作能讀取該類Template 的Framework)

■    DotLiquid的官方網站DotLiquid的 GitHub資訊它的Wiki資料(那幾篇都要看)

■    DotLiquid的 Template官方測試案例  (使用Sample)

■    Dot Liquid Template Implementation in C# and MVC

      >>我並非用此篇內容,僅是參考別人的寫法如何寫 Dot Liquid的程式碼。


最終程式碼模樣:


定義的Liquid樣版資料:

image

  • {%- -%} 多一個「-」號的用意,是Render時不讓它多占一行空白資料  (官方語法說明:http://bit.ly/2RIUWzh )


實作出DotLiquid實務上應用的程式碼:

image

  • 讀取特定的樣版資料。
  • Template Parse 該資料內容,建立起 Liquid Template。
  • 使用 Liquid 可以用的Model:實作 Liquidizable。
  • 若要透過Object,最後一定都是要呼叫:Hash.FromAnonymoutObject。


最終使用的Model模式:(採用繼承原Model後去實作ILiquidizable)

image

image

>>這最後也是回傳「匿名物件」出去。 (這邊即是定義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 意見 :

張貼留言