热带翎羽 发表于 2013-1-29 11:44:50

Grails原生的scaffolding的改进设想

Grails原生的scaffolding机制所生成的代码主要用于模型验证,在实际中基本无法直接在项目中使用,主要原因如下:


[*]生成的CRUD中的代码过于简单,不包含:搜索(Ajax)、Tooltip、表单分组/分栏等
[*]Domain模型中没有包含对所生成的View层代码的控制信息和基础信息
[*]现有的Domain模型,如果通过attributes进行自定义的扩展不符合Grails的整体思路
[*]无法实现单一模型对多个View的情况,如:针对互联网版本和针对手机客户端版本


针对以上问题,如果可以通过引入Domain元数据的方式,通过元数据中的基础信息和控制信息,生成相互联系的Gomain/Controller/Views将一定程度上提升开发的效率,具体的思路如下:


http://dl.iteye.com/upload/attachment/332320/9e66669c-85d9-3fd6-9ab5-d32b44f6a4a3.jpg

元数据定义示例:

book.groovy

class Book {static domain=static fields=[,]static views=         ]}

实现思路:


[*]通过GroovyScriptEngine动态加载所需生成对象以及所关联对象的的元数据
[*]通过GStringTemplateEngine加载模板,并生成:Domain定义、Controller和Views


Domain模板:
// 作者: bruce.lin.chn@gmail.com// 时间: $datepackage $domain.pkg//模型: $domain.chineseclass $domain.name {<% fields.each{key,value -> %>    $value.type    $key   //$value.chinese <% } %>    static constraints = {<% fields.each{key,value -> %>      $key($value.constraintsString)<% } %>    }    String toString()    {      "$domain.chinese"+"实例"    }}
Generator代码片段:
//Author: bruce.lin.chn@gmail.com//Date: 2010-10-17//Time: 12:37:10import groovy.text.TemplateEngineimport groovy.text.Templateimport groovy.text.GStringTemplateEngineoutputPath="./output"generatingClasses=["Book"]String[] loadingPaths = ['./input']engine = new GroovyScriptEngine(loadingPaths)generatingClasses.each{className->    clazz = engine.loadScriptByName(className+'.groovy')    instance = clazz.newInstance()    instance.domain.each{ key, value ->      println "    "+key+":"+value    }      instance.fields.each{ key, value ->      println "    "+key+":"+value    }    instance.fields.each{ key, value ->      value.constraintsString=""      value.constraints.each{ckey,cvalue->            if(value.constraintsString !="")            {                value.constraintsString+=","            }            value.constraintsString+=ckey+":"+cvalue.toString()      }    }    //Generating domain source code    File templateFile = new File("templates/domain.template");    TemplateEngine templateEngine = new GStringTemplateEngine();    Template template = templateEngine.createTemplate(templateFile);    println template.make(date:new Date(),domain:instance.domain,fields:instance.fields)}

生成的domain代码:

// 作者: bruce.lin.chn@gmail.com// 时间: Sun Oct 17 21:31:27 CST 2010package application.//模型: 书籍class Book {    String    name   //书名   String    author   //作者   static constraints = {      name(size:2..20,blank:false)      author(size:2..20,blank:false)    }    String toString()    {      "书籍"+"实例"    }}
页: [1]
查看完整版本: Grails原生的scaffolding的改进设想