【问题标题】:How to implement delegation with metaClass and invokeMethod?如何使用 metaClass 和 invokeMethod 实现委托?
【发布时间】:2011-08-21 04:57:55
【问题描述】:

我正在尝试创建一个有点灵活的标记解决方案。我以前曾想过这样解决它:Polymorphic belongsTo in many to many mapping in grails?。但由于这似乎没有任何结果,所以我没有朝另一个方向前进。

我现在要做的是检测域类是否具有对Tag 类的hasMany 引用。如果是这样,那么我尝试将方法委托分配给taggableService

以下代码试图做的就是找到指定的方法并在当前对象上调用它。但是,如果它没有找到它,则尝试在委托对象上调用它。如果全部失败,则抛出 MissingMethodException。

for(GrailsClass c in grailsApplication.getDomainClasses()){
    Map hasMany = c.getPropertyValue('hasMany')

    //continue of has a many mapping with Tag class as its endpoint
    if(hasMany && hasMany.containsValue(Tag)){

        //replace invokeMethod with a delegate strategy
        c.clazz.metaClass.invokeMethod = { String name, args ->
            def metaMethod = c.clazz.metaClass.getMetaMethod(name,args)
            if(metaMethod){
                return metaMethod.invoke(delegate,args);
            }

            metaMethod = taggableService.class.metaClass.getMetaMethod(name, args)
            if(metaMethod){
                return metaMethod.invoke(taggableService,args);
            }
            throw new MissingMethodException(name,delegate.class,args)
        }
    }
}

然而,这似乎并没有达到预期的效果。我在 groovyland 中迷路了,谁能帮帮我?

【问题讨论】:

  • 你看过可标记插件grails.org/plugin/taggable
  • 是的,我有,但我决定创建自己的,因为我不喜欢插件设计的各个方面。
  • 原来只是测试框架没有正确处理引导程序。如果我改为在控制器类中测试它。它工作得很好...... :(
  • 作为另一个提示,给其他尝试这样做的人。您可以使用methodMissing/missingMethod(不记得它是一个)而不是invokeMethod,因此如果缺少该方法,您只需将其传递给委托。更少的代码...

标签: grails groovy


【解决方案1】:

原来只是测试框架没有正确处理引导程序。如果我改为在控制器类中测试它。它工作得很好...... :(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2013-12-05
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多