Los marcos de inyección de dependencias en Ruby se han declarado prácticamente innecesarios. Jamis Buck escribió sobre esto el año pasado en su publicación de blog LEGOs, Play-Doh, and Programming.Sustitución de implementación de tiempo de ejecución con Ruby
La alternativa general aceptada parece estar utilizando algún grado de inyección de constructor, pero simplemente proporcionando valores predeterminados.
class A
end
class B
def initialize(options={})
@client_impl = options[:client] || A
end
def new_client
@client_impl.new
end
end
Este enfoque está bien para mí, pero parece que falta una cosa de las configuraciones más tradicionales: una manera de sustituir implementaciones en tiempo de ejecución basado en algunas interruptor externo.
Por ejemplo, con un marco de inyección de dependencias que podía hacer algo como esto (Pesudo-C#):
if (IsServerAvailable)
container.Register<IChatServer>(new CenteralizedChatServer());
else
container.Register<IChatServer>(new DistributedChatServer());
Este ejemplo simplemente registra una IChatServer
implementación diferente dependiendo de si nuestro servidor centeralized está disponible.
Como todavía estamos utilizando el constructor en Ruby, no tenemos control de programación sobre las dependencias que se usan (a menos que especifiquemos cada una nosotros mismos). Los ejemplos que da Jamis parecen adecuados para hacer que las clases sean más comprobables, pero parecen carecer de las facilidades para la sustitución.
¿Cuál es mi pregunta? ¿Cómo resuelves esta situación en Ruby? Estoy abierto a cualquier respuesta, incluso "simplemente no necesitas hacer eso". Solo quiero saber la perspectiva de Ruby sobre estos asuntos.