如何在不同范围内的类中调用委托?

时间:2019-04-18 19:19:09

标签: groovy jenkins-job-dsl

我正在重构我的Jenkins Job DSL脚本以使其更易于维护,其中的主要部分之一是将代码分成多个文件。为此,我需要做的一部分工作是将我用于构建模块化作业的“构建模块”闭包移出脚本范围,移入类中。如果我将它们保留为闭包,则似乎无法获得方法签名或正确调用它的方法,如果我将它们转换为方法,则它们会破坏调用站点周围的闭包。我希望能够像这样重构它,但是我在使用它时遇到的困难也使我认为它可能并不是真正可行的设计。

我创建了一个新类,并将全局定义的闭包作为静态方法和属性移入了该类,并尝试更改了.call()的调用方式。我还试图明确地查看更改传入的delegate参数以使用this是否可以解决该问题,因为我可能会误解嵌套的闭包,但事实并非如此。

我最初基于的原始模式是this article。 我已经阅读了关于这些问题one two以及所有其他站点的所有答案,尽管它们使我对闭包有了更好的理解(以及对常规文档的阅读) ,我无法成功诊断出这种特定范围关系的问题

原文:

base_emailNotification = {
  PublisherContext publisherContext -> publisherContext.with {
      extendedEmail {
        disabled()
        }
      }
  }
}

def createDemoJob() {
  return job("jobname") {
    publishers {
      base_emailNotification delegate
    }
  }
}

createDemoJob()

新(尝试):

class Blocks {
  static emailNotification(publisherContext) {
    publisherContext.with {
      extendedEmail {
        disabled()
        }
      }
  }
}


def createDemoJob() {
  return job("jobname") {
    publishers {
      Blocks.emailNotification delegate
    }
  }
}

createDemoJob()

(此外,与此主题相关的变化,例如不使用静态方法,尝试将闭包设置为属性)

我想复制脚本范围中定义的闭包所具有的功能,即,这两个在功能上是等效的:

    publishers {
      Blocks.emailNotification delegate
    }
    publishers {
      extendedEmail {
        disabled()
      }
    }

0 个答案:

没有答案