Compartir variables de instancia entre clases ruby
Sé que esta pregunta se ha respondido antes, pero parece que no puedo hacer que ninguna de las soluciones funcione
Estoy haciendo un contenedor de rubíes para una API a la que necesito llamar. La clase Interface realiza todo el manejo de la sesión y la llamada real de la API, pero quiero crear clases auxiliares para las funciones que realizaré con más frecuencia. El problema que tengo es que necesito una forma de mantener una instancia de la clase Interface en varias clases auxiliares.
Aquí está el código que tengo hasta ahora
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
Quiero poder usar mi código así.
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.
El problema que tengo es que la clase Interface maneja el token de sesión que cambia de llamada a llamada. Quiero poder dividir mi código limpiamente en secciones, comosession
ydata
mientras usa solo una instancia de la clase de interfaz.
No quiero que estos métodos devuelvan nada más que los valores de retorno de la API. Es decir, no quiero pasar manualmente una instancia de la clase de interfaz o variables de sesión, etc. ¿Es esto posible?