Совместное использование переменных экземпляра между классами ruby
Я знаю, что на этот вопрос уже был дан ответ, но я не могу заставить какие-либо решения работать
Я делаю рубиновую оболочку для API, который мне нужно вызвать. Класс Interface выполняет всю обработку сеанса и фактический вызов API, но я хочу создать вспомогательные классы для функций, которые я буду выполнять чаще всего. У меня проблема в том, что мне нужен способ поддержки одного экземпляра класса Interface для нескольких вспомогательных классов.
Вот код у меня пока
require_relative 'interface'
module Api_Helper
attr_accessor :xmlmc
#get a new instance of the interface, This should be the only instance used.
#I don't know if this needs to go in its own module
def initialize server, port = '5015'
@xmlmc = Xmlmc::Interface.new server, port
end
end
module Xmlmc
class API
include Api_Helper
module Session
#session helpers use invoke method to send calls to the api via the interface class
def invoke service, operation, parameters
Xmlmc::API.xmlmc.invoke service, operation, parameters
end
end
module Data
#data helpers use invoke method to send calls to the api via the interface class
def invoke service, operation, parameters
Xmlmc::API.xmlmc.invoke service, operation, parameters
end
end
def session
#extend the session module into its own class
_session = Object.new
_session.extend Session
_session
end
def data
#extend the data helpers into its own class
_data = Object.new
_data.extend Data
_data
end
end
end
Я хочу иметь возможность использовать мой код, как это.
api = Xmlmc::API.new 'localhost', '2000'
@session = api.session
@session.logon 'username', 'password'
@data = api.data
@data.query = 'select * from table' #requires a session first.
Проблема, с которой я столкнулся, заключается в том, что класс Interface обрабатывает маркер сеанса, который изменяется от вызова к вызову. Я хочу, чтобы мой код был четко разделен на разделы, напримерsession
а такжеdata
при использовании только одного экземпляра класса интерфейса.
Я не хочу, чтобы эти методы возвращали что-либо большее, чем возвращаемые значения API. То есть я не хочу вручную передавать экземпляр класса интерфейса или переменных сеанса и т. Д. Возможно ли это?