当前位置:  开发笔记 > 前端 > 正文

如何在不使用继承的情况下向控制器添加常用操作?

如何解决《如何在不使用继承的情况下向控制器添加常用操作?》经验,为你挑选了2个好方法。

我需要在不使用继承的情况下向多个控制器添加常用操作.我们所有的控制器都扩展了一个抽象控制器,我想要包含的功能在抽象控制器中没有意义.

我最初的想法是使用Mixin,但似乎动作,因为它们是闭包,不会与包含mixin的控制器"混合",只有方法.

任何人都可以建议一种方法,我可以获得"mixin"功能,以添加动作到控制器?

谢谢!



1> Michael Borg..:

我们所有的控制器都扩展了一个抽象控制器,我想要包含的功能在抽象控制器中没有意义.

那为什么没有第二个抽象控制器扩展基本控制器,而只是由那些需要此功能的控制器扩展?

对我来说,这听起来像是最简单,最干净的解决方案 - 当然比使用元编程更好."首选组合继承"并不意味着继承是一种根本不可靠的事情,应该不惜一切代价避免.


如果这是一个选项,那么这肯定比我在答案中建议的更好.

2> Jean Barmash..:

执行此操作的方法是迭代控制器并使用元编程向其添加方法.

举个例子,查看perf4j插件(文件Perf4jGrailsPlugin.groovy).

在其中,你会看到类似的东西:

application.controllerClasses.each() {
            addPerf4jMethods(it.clazz, log)
        } 

def addPerf4jMethods(artefactClass, log) {
        log.info "Adding Per4j methods: ${artefactClass}..."


        artefactClass.metaClass.withStopwatch << { Closure callable ->
            withStopwatch("", null, callable)
        }

        artefactClass.metaClass.withStopwatch << { String tag, Closure callable ->
            withStopwatch(tag, null, callable)
        } 
}

在上面的代码中,您将遍历所有控制器并使用DockWatch添加方法,因此它们现在可以在任何地方使用.如果您只需要在某些控制器中执行此操作,则显然可以进行额外的检查.

您可以将此代码放入BootStrap.groovy,以便每次应用启动时运行.


控制器动作不是方法,而是Closure类型的属性!因此,您的示例在此上下文中并不完全正确.但是,您当然也可以通过ExpandoMetaClass添加属性,因此使用元编程通常可以解决此问题.并且感谢您参考Perf4j插件(恰好由我编写;-)).
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有