Лучшая практика для обмена глобальными данными по нескольким задачам Thor
В настоящее время я создаю исполняемый файл Thor, который поддерживает несколько различных задач. Некоторые задачи вызывают другие задачи. Например
- Auth
- аутентифицирует локального пользователя
- Создайте
- Invoke Auth
- Делает что-то
- Вызвать настройку
- Настройка:
- Invoke Auth
- Делает что-то
Приятно то, что я могу теперь вызывать все три задачи по отдельности, но быть уверенным, что проверка подлинности, например, вызывается только один раз через invoke.
Но что сейчас является лучшим способом обмена данными между этими задачами. Например, при аутентификации я хочу установить идентификатор пользователя текущего пользователя. Таким образом, когда я хочу запросить данные из нашего веб-сервиса, я могу получить идентификатор пользователя из любого места в моем коде таким же образом.
Прямо сейчас я реализую это через Модули, но я не совсем уверен, является ли это лучшим способом сделать это.
Использование Singleton было бы другим способом, но каким-то образом это кажется слишком большим для этой цели.
Может быть, у вас, ребята, есть опыт с лучшим способом сделать это, или, может быть, использование модулей - лучший способ хранить информацию в любом случае.
2 ответа
Я бы сделал что-то вроде этого:
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 в каждом файле)
PS Структура фрагмента кода может быть неточной, я просто хотел поделиться некоторыми базовыми элементами. Сделайте что-нибудь подобное для оставшихся классов.
Если вам просто нужно хранить простые структуры данных, я бы пошел для общих переменных класса
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