CodeSmith 使用主從代碼模板

2018-10-12 13:55 更新

使用主從代碼模板

在前面的教程 CodeSmith 使用教程(3): 自動(dòng)生成 Yii Framework ActiveRecord 我們使用了主,從模板來實(shí)現(xiàn)了從數(shù)據(jù)庫為 Yii Framework 生成多個(gè)表的 ActiveRecord 類定義,中 CodeSmith 項(xiàng)目中通過主模板和從模板的配合可以實(shí)現(xiàn)復(fù)雜的代碼生成過程,主模板和從模板的關(guān)系有點(diǎn)類似主程序和子函數(shù)的關(guān)系。使用主-從模板的基本步驟如下:

  • 定義從模板,從模板可以定義屬性
  • 定義主模板,中主模板中如果要使用從模板,首先需要在主模板中注冊從模板,主模板中也也可以定義屬性,主模板和從模板中的屬性可以通過定義“合并”模式構(gòu)造最終模板所定義的屬性集合。
  • 調(diào)用主模板,設(shè)置主模板和從模板所需的屬性生成所需代碼

注冊子模板

<%@ Register Name="Header" Template="Header.cst"
  MergeProperties="True" ExcludeProperties="IncludeMeta" %>

Name:子模板在主模板中的類型名稱,在主要模板中可以通過該類型創(chuàng)建子模板的實(shí)例 Template: 子模板文件名 MergeProperties: 是否需要把子模板中定義的屬性:“合并”到主模板中。缺省為 False ExcludeProperties: 如果子模板的屬性合并到主模板中時(shí)需要排除的屬性列表,以逗號分隔。

子模板復(fù)制主模板中的屬性

MergeProperties=”True” 可以把從模板中的屬性合并到主模板中,如果從模板需要引用主模板的屬性,比如主模板中定義了服務(wù)器地址,在多個(gè)子模板中都需要引用這個(gè)屬性,此時(shí)可以通過復(fù)制父模板屬性 CopyPropertiesTo 來實(shí)現(xiàn):

// instantiate the sub-template
Header header = this.Create<Header>();

// copy all properties with matching name and type to the sub-template instance
this.CopyPropertiesTo(header);

CopyPropertiesTo 方法比較主模板中定義的屬性和子模板中定義的屬性,如果發(fā)現(xiàn)從模板中定義的屬性和主模板中定義的屬性名稱類型相同(匹配)則把主模板中屬性值復(fù)制到子模板中。

設(shè)置子模板屬性

在主模板中要?jiǎng)?chuàng)建子模板的實(shí)例,可以直接通過 Create 方法

// instantiate the sub-template
Header header = this.Create<Header>();

// include the meta tag
header.IncludeMeta = true;

Create 中的 Header 為注冊子模板時(shí) Name 來定義的類型,通過 Create 創(chuàng)建子模板的實(shí)例后,就直接可以通過該實(shí)例的屬性來訪問子模板中的屬性,比如上面代碼中 IncludeMeta 為子模板中定義的一個(gè)屬性。

從子模板輸出結(jié)果

創(chuàng)建好子模板的實(shí)例,設(shè)置好子模板的屬性,在主模板中就可以讓子模板輸出結(jié)果,有幾種方法可以從子模板輸出內(nèi)容。

第一種是把子模板生成的結(jié)果直接插入到主模板中

// instantiate the sub-template.
Header header = this.Create<Header>();
// render the sub-template to the current output stream.
header.Render(this.Response);

第二種方法是把結(jié)果輸出到單獨(dú)的文件中:

// instantiate the sub-template.
Header header = this.Create<Header>();
// render the sub-template to a separate file.
header.RenderToFile("Somefile.txt");

具體的例子可以參見 CodeSmith 使用教程(3): 自動(dòng)生成 Yii Framework ActiveRecord

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號