从我之前的question我了解到Rails为每个请求创建了一个控制器实例。
我的问题是,因为这个主题与我正在研究的项目的设计有关:
为什么Rails会创建
的新实例class SomeController < ApplicationController; end
处理每个传入的请求?为什么不创建单例对象并将请求转发给这个?这似乎更有效,因为我们不会浪费资源来分配和清理请求对象?
答案 0 :(得分:36)
实例化新控制器实例的开销微不足道,这意味着两个完全不相关的请求之间没有意外共享状态。处理器时间的任何“节省”都会被产生破坏性错误的可能性所抵消。
请记住,控制器用于存储特定于请求的状态。重复使用控制器将要求您在每个操作开始时重置您设置的每个@variable
。否则,@is_admin = true
之类的内容可能会被设置并且永远不会被清除。你实际上引入的不那么人为的错误会更加微妙,并且会影响开发人员的时间。
你看到没有的优化。 Something 必须保持状态并在请求之间重置它,否则你会遇到意外共享状态的噩梦。如果您在请求之间保留控制器实例,那么您只需将维护/重置状态的工作推送到某个较低级别,其中答案可能仍然来实例化某个状态管理的新实例每个请求的类。分配和释放资源时,计算机非常好,因此从不担心这一点,直到您确实知道它是一个瓶颈。在这种情况下,为每个请求实例化一个新控制器很容易就是正确的选择。
对于Rails,能够使用@variable = value
是代码清晰度和可用性立场的主要胜利,这或多或少需要在请求完成时丢弃控制器的每个实例。