7

Al escribir código que debe ser capaz de identificar dos grandes grupo de objetos:inyección de dependencias, la inyección de un objeto "inyectable" (servicio) en un newable (entidad)

  • Inyectables
  • Newables

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

  • objetos inyectables son objetos (servicios) que exponen dependencias en sus constructores estas dependencias habitualmente se resuelven usando un contenedor IoC, estos objetos sólo pueden pedir otros inyectables en sus constructores

  • Newable son objetos que también se exponen dependencias en sus constructores, pero newables sólo pueden pedir otros objetos newable (entidades, Value Objects), otra de las características de los objetos newable es que no deberían contener una referencia a un objeto inyectable

Pero al escribir código, que a menudo necesidad de "inyectar" un servicio hielo (inyectable) en una Entidad (nueva)

He estado pensando que tal vez exponer una dependencia de servicio en un objeto nuevo es mejor hacerlo a nivel de método, pero esto parece mucho trabajo ... solo pensando en resolver las dependencias cada vez que un método es llamado así .... esto huele tendríamos que usar el Servicio de Localización de anti-patrón

la forma en que he resuelto esto es:

  • Crear una interfaz con un método que expone la dependencia (el servicio se usará en este método)

  • Crear un método de extensión para la interfaz y colocarlo en un espacio de nombres diferente, tal vez en otra asamblea, y acaba de concluir la llamada al método original para resolver la dependencia usando un localizador de servicios

Hacer esto nos tener una separación consistente entre objetos nuevos e inyectables con la capacidad de usar servicios en nuestros nuevos objetos fácilmente

  • ¿Qué opinas?
  • El uso del localizador de servicios en un método de extensión se considera una mala práctica?
  • ¿Cómo realizaría la prueba unitaria de la llamada al método de extensión?
+1

Muy relacionado: http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven

+0

Thx este enlace fue realmente útil – Jupaol

Respuesta

2

Pero al escribir código, a menudo necesitamos "inyectar" un servicio (inyectable) en una entidad (newable)

Este no es el caso- si usted encuentra la necesidad de Haga esto, entonces hay alguna funcionalidad que existe en la Entidad que debería estar en un servicio.

Digamos que su producto nuevo es ShoppingCart y su inyectable es una base de datos repository. Desea poder hacer esto:

// somehow cart already got the repository 
cart.save(); 

Bueno, lo está haciendo mal. En su lugar tiene que cambiar las cosas y hacer:

respository.save(cart); 

Si se pudiera proporcionar una situación de cuando se siente la necesidad de hacer esto, podríamos discutir detalles de esa situación.

Cuestiones relacionadas