Spec-Zone.ru › Ruby on Rails 4.1

модуль ActiveSupport::PerThreadRegistry

Этот модуль используется для инкапсуляции доступа к переменным, локальным для потока.

Вместо загрязнения пространства имён потоковых локалей:

Thread.current[:connection_handler]

вы определяете класс, расширяющий этот модуль:

module ActiveRecord
  class RuntimeRegistry
    extend ActiveSupport::PerThreadRegistry

    attr_accessor :connection_handler
  end
end

и вызываете объявленные методы доступа к экземплярам в качестве методов класса. Например

ActiveRecord::RuntimeRegistry.connection_handler = connection_handler

устанавливает обработчик соединения, локальный для текущего потока, и

ActiveRecord::RuntimeRegistry.connection_handler

возвращает обработчик соединения, локальный для текущего потока.

Эта функция достигается путём создания экземпляра класса и хранения экземпляра в качестве локальной переменной потока с ключом, основанным на имени класса. В приведённом примере ключ “ActiveRecord::RuntimeRegistry” хранится в Thread.current. Методы класса являются прокси для указанного экземпляра локальной переменной потока.

Если класс имеет инициализатор, он не должен принимать аргументы.

Публичные методы класса

extended(object) Показать исходный код
# File activesupport/lib/active_support/per_thread_registry.rb, line 35
def self.extended(object)
  object.instance_variable_set '@per_thread_registry_key', object.name.freeze
end

Публичные методы экземпляра

instance() Показать исходный код
# File activesupport/lib/active_support/per_thread_registry.rb, line 39
def instance
  Thread.current[@per_thread_registry_key] ||= new
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API