使用一个操作多次实例化抽象类

时间:2014-09-03 23:20:26

标签: grails data-binding abstract-class instantiation command-objects

所以我有一个,比方说,Pet抽象类,以及它的三个具体实现 - 让我们说CatDogBird。正如具体类所做的那样,这些人共享共同的字段,并且还有唯一的字段 - 例如,它们都有Legs,但只有鸟有Wings。因此,GSP不同,更新方法不同等等。

技巧是我需要能够在单个操作中实例化,验证和持久化不确定数量的实例。简单的实现基本上如下:

create.gsp

Cat Hair Color: <g:textField name="catInstance.hairColor"/>
Dog Hair Color: <g:textField name="dogInstance.hairColor"/>
Bird Feather Color: <g:textField name="birdInstance.featherColor"/>

PetCommand.groovy

class PetCommand {

    Cat catInstance
    Dog dogInstance
    Bird birdInstance

}

PetController.groovy

def save(PetCommand cmd) {

    def catInstance = cmd.catInstance
    def dogInstance = cmd.dogInstance
    def birdInstance = cmd.birdInstance

    /* do stuff */

}

当然,在实际的应用程序中,这会变得非常混乱,这完全违背了使用抽象类的目的。

是否有某种方法可以一次性绑定多个Pet个实例,然后只是循环遍历它们,例如,传入参数进行更新?我不知道,这一切都很混乱。

命令对象不是绝对必要的,但是它们修复了Grails控制器的许多烦人的冗余。

1 个答案:

答案 0 :(得分:0)

基于Joshua Moore上面的评论,看起来答案会是这样的:

模板(例如_bird.gsp

    Bird Feather Color: <g:textField name="pets['bird'].featherColor"/>

<强> GSP

    /* based on other logic, render appropriate templates */

命令对象

    List pets = [].withLazyDefault { petType -> return PetFactory.createPet(petType) }

工厂(天真实施)

    def createPet(String petType) {
        switch (petType) {
            case 'bird': return new Bird(); break;
        // ...etc...
    }

<强>控制器

def update(PetCommand cmd) {
    cmd.pets?.each {
        petService.update(it, params)
    }
    /* ...etc... */
}

<强>服务

def update(Pet petInstance, Map params) {
    petInstance.update(params)
}

<强>域

def update(Map params) {
    /* domain-specific business logic based on user input */
}

尚未实施;如果结果不起作用,我会尝试更新它。