Лучшая практика для обмена глобальными данными по нескольким задачам Thor - PullRequest
0 голосов
/ 16 марта 2012

В настоящее время я создаю исполняемый файл Thor, который поддерживает несколько различных задач.Некоторые задачи вызывают другие задачи.Например,

  • Auth
    • аутентифицирует локального пользователя
  • Создать
    • Invoke Auth
    • Делаетчто-то
    • Invoke Configure
  • Configure:
    • Invoke Auth
    • Что-то делает

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

Но что сейчас является лучшим способомобмениваться данными между этими задачами.Например, при аутентификации я хочу установить идентификатор текущего пользователя.Таким образом, когда я хочу запросить данные из нашего веб-сервиса, я могу получить идентификатор пользователя из любого места в моем коде таким же образом.

Сейчас я реализую это через модули, но я не совсем уверен, что этолучший способ сделать это.

Использование Singleton было бы другим способом, но почему-то это кажется слишком сложным для этой цели.

Может быть, у вас, ребята, есть опыт с лучшим способом сделать этоэто, или, возможно, использование модулей - лучший способ хранить информацию в любом случае.

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Я бы сделал что-то вроде этого:

module PRJ

  class << self
    attr_accessor :api_key, :account_name, :api_version, :api_url, ......

    def configure
     yield self
    end
  end

end

require "#{directory_of_all_other_classes}"

require 'thor'

class CLI < Thor
include Thor::Actions

def login
  ...
  PRJ.api_key = response[:api_key] 
end

Поскольку вы хотите вызывать Auth во всех случаях, я думаю, что это должно быть в основном файле CLI.

Что касается хранения и использования данных, было бы лучше использовать атрибуты вместо констант. Возможно, я не прав в этом, но я предпочитаю использовать атрибуты класса.

Теперь вы можете получить доступ и изменить PRJ.api_key из любой точки мира (для каждого файла требуется модуль PRJ)

P.S. Структура фрагмента кода может быть неточной, я просто хотел поделиться некоторыми базовыми элементами. Сделайте что-то подобное для оставшихся классов.

0 голосов
/ 30 октября 2013

Если вам просто нужно хранить простые структуры данных, я бы пошел для общих переменных класса

class Test < Thor
  @@my_shared_var = nil 

  desc 'my_first_task','sdfasdf'
  def my_first_task
    @@my_shared_var = 'foo'
  end

  desc 'my_second_task','sdfasdf'
  def my_second_task
    invoke :my_first_task
    puts @@my_shared_var
  end

end
...