0

所以我有一个,比方说,Pet抽象类,以及它的三个具体实现——比方说CatDogBird。正如具体的类所做的那样,这些家伙共享共同的领域,也有独特的领域——例如,他们都有Legs,但只有 Birds 才有Wings。因此,GSP 不同,更新方法不同,等等。

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

创建.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 控制器的许多烦人的冗余问题。

4

1 回答 1

0

所以根据上面 Joshua Moore 的评论,看起来答案是这样的:

模板(例如,_bird.gsp

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

普惠制

    /* 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 */
}

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

于 2014-09-04T16:48:49.550 回答