zoukankan      html  css  js  c++  java
  • CodeSmith: 使用主从代码模板 Register

    CodeSmith项目中通过主模板和从模板的配合可以实现复杂的代码生成过程,主模板和从模板的关系有点类似主程序和子函数的关系。使用主-从模板的基本步骤如下:
    • 定义从模板,从模板可以定义属性
    • 定义主模板,中主模板中如果要使用从模板,首先需要在主模板中注册从模板,主模板中也也可以定义属性,主模板和从模板中的属性可以通过定义“合并”模式构造最终模板所定义的属性集合。
    • 调用主模板,设置主模板和从模板所需的属性生成所需代码

    注册子模板

    <%@ Register Template="../IDAL/IDAL.cst" Name="MenthodTemplate" MergeProperties="True" ExcludeProperties="SourceCommand,BatchMode,CommandClassName,ResultRowClassName,Accessibility,OutputFile" %>
    

    Name:子模板在主模板中的类型名称,在主要模板中可以通过该类型创建子模板的实例
    Template: 子模板文件名
    MergeProperties: 是否需要把子模板中定义的属性:“合并”到主模板中。缺省为False
    ExcludeProperties: 如果子模板的属性合并到主模板中时需要排除的属性列表,以逗号分隔。

    子模板复制主模板中的属性
    MergeProperties=”True” 可以把从模板中的属性合并到主模板中,如果从模板需要引用主模板的属性,比如主模板中定义了服务器地址,在多个子模板中都需要引用这个属性,此时可以通过复制父模板属性CopyPropertiesTo来实现:

        // instantiate the sub-template  
        MenthodTemplate m= this.Create<MenthodTemplate>();  
          
        // copy all properties with matching name and type to the sub-template instance  
        this.CopyPropertiesTo(m);  

    CopyPropertiesTo方法比较主模板中定义的属性和子模板中定义的属性,如果发现从模板中定义的属性和主模板中定义的属性名称类型相同(匹配)则把主模板中属性值复制到子模板中。

    设置子模板属性

    在主模板中要创建子模板的实例,可以直接通过Create方法

        // instantiate the sub-template  
        MenthodTemplate m= this.Create<MenthodTemplate>();  
          
        // include the meta tag  
        m.IncludeMeta = true;  

    Create中的MenthodTemplate为注册子模板时Name来定义的类型,通过Create创建子模板的实例后,就直接可以通过该实例的属性来访问子模板中的属性,比如上面代码中IncludeMeta为子模板中定义的一个属性。

    从子模板输出结果创建好子模板的实例,设置好子模板的属性,在主模板中就可以让子模板输出结果,有几种方法可以从子模板输出内容。第一种是把子模板生成的结果直接插入到主模板中
        // instantiate the sub-template.  
        MenthodTemplate m= this.Create<MenthodTemplate>();  
        // render the sub-template to the current output stream.  
        m.Render(this.Response);  

    第二种方法是把结果输出到单独的文件中:

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

  • 相关阅读:
    【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
    【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
    【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
    【nodejs原理&源码赏析(5)】net模块与通讯的实现
    【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
    工作一年多的感慨与总结(二)
    工作一年多的感慨与总结(一)
    动手实践Mybatis插件
    MySQL存储引擎
    Tomcat类加载架构
  • 原文地址:https://www.cnblogs.com/ful1021/p/4804430.html
Copyright © 2011-2022 走看看