重用 Grails 标准闭包的一部分

Posted

技术标签:

【中文标题】重用 Grails 标准闭包的一部分【英文标题】:Reusing part of Grails criteria closure 【发布时间】:2013-12-10 05:48:27 【问题描述】:

我的 Grails 应用程序中有一个相当大的标准闭包,我想在我的应用程序的多个地方重用它的一部分。我不想复制我需要重用的部分,而是想将它定义为一个单独的闭包并在需要的地方引用它,但我在语法上有点挣扎。

这是一个简化/缩减的版本,但基本上我的标准看起来像这样:

def criteriaClosure = 
    and 
        // filtering criteria that I'd like to reuse in lots of places
        or 
            names.each  name ->
                sqlRestriction(getFilteringSql(name), [someId])
            
        

        if (isOrganisationChild(childDefaultGrailsDomainClass)) 
            sqlRestriction(getFilteringSql(domain), [someArg])
        

        // filtering criteria that's specific to this particular method
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    


def criteria = domain.createCriteria()
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure)

我已经尝试将我想要重用的闭包部分定义为变量,并在我的条件闭包中引用它,但是它定义的限制似乎没有被应用。

def reusableClosure = 
    and 
        or 
            names.each  name ->
                sqlRestriction(getFilteringSql(name), [someId])
            
        

        if (isOrganisationChild(childDefaultGrailsDomainClass)) 
            sqlRestriction(getFilteringSql(domain), [someArg])
        
    


def criteriaClosure = 
    and 
        reusableClosure() //this doesn't seem to work
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    

我确信这一定是一件非常简单的事情,所以如果这是一个愚蠢的问题,我深表歉意。有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为您必须将委托传递给reusableClosure,即:

def criteriaClosure = 
    and 
        reusableClosure.delegate = delegate
        reusableClosure()
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    

【讨论】:

成功了,谢谢。 - 顺便说一句,为什么'reusableClosure'后面的括号是必要的? 酷 :-) 因为这会调用闭包(它将 and 块返回到 Criteria)

以上是关于重用 Grails 标准闭包的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 中的数据库中持久化闭包?

如何模拟闭包以测试 Grails 服务结果?

Grails - 从自定义验证器闭包调用内置约束

升级后 Grails 验证不起作用

Grails Shiro LDAP用户/角色身份验证:如何/如何捕获和存储以供重用

Grails/GORM“入”标准