【问题标题】:Caching state with Grails controllers使用 Grails 控制器缓存状态
【发布时间】:2014-12-30 01:19:00
【问题描述】:

我了解 Grails 非常努力地实现无状态,但是我需要我的一个控制器保留一个特定的 fizz 值,该值应该在每个 HTTP 请求中找到:

class MyController {
    List<Fizz> cachedFizzes = new ArrayList<Fizz>()

    def index() {
        Fizz fizz = extractFizz(params)
        cachedFizzes << fizz

        ...
    }

    ...
}

但是,在本地测试此方法时,似乎 cachedFizzes 会随着每个 HTTP 请求重新实例化,因此无论我调用此控制器的某个操作多少次,Fizzes 的列表都不会增长。

所以我问:我如何(具体)将List&lt;Fizz&gt; 注入List&lt;Fizz&gt;,该List&lt;Fizz&gt; 将在应用程序 的整个生命周期中存在并增长(而不是控制器/HTTP 请求)?

【问题讨论】:

  • “我需要我的一个控制器来保留一个特定的 fizz 值,该值应该在每个 HTTP 请求中找到”——这听起来像是一个错误的要求。我希望,如果您深入研究并弄清楚实际需求是什么,您最终会得到一个更好的解决方案。我无法准确猜测实际要求是什么,但我敢打赌,这可能更像是您需要访问每个请求中的特定值,而不是需要在控制器实例中维护该值尤其是,这几乎肯定是错误的做法。
  • 更常见且问题较少的事情通常涉及在控制器之外的某处维护该状态,例如可以但不必是服务的单例 bean。您可能仍然希望您的控制器是单例的,但这并不是因为这可以帮助您完成您在此处尝试做的事情。

标签: grails caching model-view-controller singleton stateless


【解决方案1】:

很少需要为每个请求创建一个新的控制器实例,所以最好在Config.groovy 中将它们配置为单例:

grails.controllers.defaultScope = 'singleton'

但我认为这是可配置的 Grails 版本的默认设置 - 您使用的是什么版本的 Grails?

另一个适用于单例或每请求实例控制器的选项是使 cachedFizzes 静态。

无关 - new ArrayList&lt;Fizz&gt;() 太冗长了;只需使用[]。您仍然会在左侧拥有自记录集合和泛型类型,并且它们的功能相同。

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 2017-01-05
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2010-12-19
    • 2010-11-28
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多