26

从我之前的问题中,我了解到 Rails 会为每个请求创建一个控制器实例。

我的问题是,因为这个主题与我正在从事的项目的设计有关:

为什么 Rails 会创建一个新的实例

class SomeController < ApplicationController; end

处理每个传入的请求?为什么不直接创建单例对象并将请求转发给这个对象呢?这似乎更有效,因为我们不会浪费资源为请求分配和清理对象?

4

1 回答 1

40

实例化一个新的控制器实例的开销是微不足道的,这意味着两个完全不相关的请求之间没有意外共享状态。处理器时间的任何“节省”都将被产生破坏性错误的可能性所抵消。

请记住,控制器用于存储特定于请求的状态。重用控制器需要你在@variable每一个动作开始时重置你曾经设置的每一个。否则,类似的东西@is_admin = true可能会被设置并且永远不会被清除。您实际上要引入的不那么人为的错误会更加微妙,并且会占用开发人员的时间。

您会看到没有优化的地方。某些东西必须保持状态并在请求之间重置它,否则您会遇到意外共享状态的噩梦。如果您在请求之间保持控制器实例,您只是将维护/重置状态的工作推到较低级别,答案可能仍然是为每个请求实例化某个状态管理类的新实例。计算机非常擅长分配和释放资源,所以在您真正知道这是一个瓶颈之前,永远不要担心这一点。在这种情况下,为每个请求实例化一个新的控制器很容易成为正确的选择。

在 Rails 的情况下,从代码清晰度和可用性的角度来看,能够使用@variable = value是一个重大胜利,这或多或少需要在请求完成时丢弃控制器的每个实例。

于 2013-01-05T15:32:41.233 回答