alt text

Inconvenientes del patrón ServiceLocator

El patrón ServiceLocator puede generar confusión a la hora de utilizarlo. Al ser un “repositorio de servicios” se tiende a realizar la petición del servicio en el momento que se necesita en vez de en el constructor. Es decir, tenemos una clase con constructor vacío que, en principio nos indicaría que no tiene ninguna dependencia, y dentro de una función de esa clase tendríamos una llamada a ServiceLocator demandando la resolución de una dependencia. Esta manera de usarlo hace que no sea intuitivo saber las dependencias de una clase ya que tendríamos que mirar donde se utiliza el ServiceLocator para saber todas sus dependencias.

Beneficios de la Inyección de Dependencias

Cuando la aplicación va creciendo y, por lo tanto, empezamos a tener una cantidad considerable de dependencias recomiendo utilizar la Inyección de Dependencias por constructor. Como vemos en la tabla, utilizando la Inyección de Dependencias podemos visualizar rápidamente las dependencias de una clase mirando su constructor. Además, utilizando frameworks (AutoFac) de Inyección de Dependencias nos permite tener los registros centralizados en un solo lugar y nos da mucha potencia a la hora de registrar las dependencias según las necesidades de nuestra aplicación.

Desde muchos foros se indica que el registro manual de las dependencias puede ser un contra a la hora de utilizar la Inyección de Dependencias. Hay aplicaciones que para funcionar necesitan registrar alrededor de 100 dependencias. Esto puede derivar en código no mantenible, una fuente de errores importante y hacer que el desarrollador tenga que conocer todas las dependencias que debe registrar.

Esto se puede solucionar mediante los registros automáticos de las dependencias mediante reflection. Una solución que propongo es realizar una búsqueda de dependencias desde la raíz de la aplicación. Mediante reflection obtenemos el punto de entrada de la aplicación, obtenemos y registramos sus dependencias; a su vez, obtenemos y registramos las dependencias de las dependencias y así sucesivamente.

Un ejemplo:


El punto de entrada de una aplicación es:

ServicioA(ServicioB, ServicioC);

Las dependencias son:

ServicioB(ServicioD)
ServicioC(ServicioE)

El registro automático realizaría:

  • Registro de ServicioA
  • Obtención de las dependencias de ServicioA (ServicioB y ServicioC)
  • Registro de ServicioB
  • Registro de ServicioC
  • Obtención de las dependencias de ServicioB (ServicioD)
  • Obtención de las dependencias de ServicioC (ServicioE)
  • Registro de ServicioD
  • Registro de ServiceE