2009-10-29 11 views
8

Estoy usando Dependency Injection en mi código (con Ninject) y pensé que me estaba yendo bastante bien hasta que encontré un problema de rendimiento causado por un malentendido acerca de dónde cabían los contenedores DI en tu código. Parece que hay mucha información sobre cómo usar marcos DI pero no demasiado sobre dónde no usarlos o cómo usarlos (al menos eso pude encontrar)Mejores prácticas de inyección de dependencia

Pensé que escribiría lo que Pensé en algunas de las mejores prácticas y ver si otras personas están de acuerdo conmigo y qué otras mejores prácticas se pueden haber propuesto.

  • Utilice uno de granos por aplicación o dominio de aplicación
  • Uso del contenedor DI para Singleton de larga vida sólo objetos, fábricas de uso (u otros métodos) para objetos transitorios de corta duración)
  • Prefiero Constructor de inyección sobre la propiedad o Inyección de campo
  • Solicitar objetos, no crearlos
  • others ?? consejos para buenos blogs/artículos?
+0

¿Qué es kernel? ¿Es ese un concepto específico de Ninject (no lo han visto en ningún otro lado)? – zvolkov

+0

también, las inyecciones setter vs. constructor es un argumento religioso y, como tal, debe evitarse. – zvolkov

Respuesta

7

He aquí una breve lista de los puntos más importantes (algunos de los cuales también aparecen en el OP):

  • Código debe ser consciente de los cuales DI Container (si los hay) se utiliza
  • Componer toda la aplicación en la raíz de la aplicación (la raíz Composición)
  • favor Constructor inyección

no puedo decir estoy de acuerdo con su punto sobre objetos Singleton vs. Transitorios. El objetivo de DI es que un mecanismo externo (como un Contenedor DI) determina la vida útil de cualquier dependencia dada, no de otra persona, por lo que debe tener todas las dependencias administradas por el Contenedor DI.

+0

Hola, Mark, mira la discusión aquí (http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8) sobre el rendimiento de Ninject en las aplicaciones. Como usted, pensé que el contenedor DI debería usarse en todas partes, pero la sobrecarga de los contenedores DI es tal que crear grandes cantidades de objetos transitorios puede ser molesto. Su consejo es excelente para aplicaciones web quizás, pero no tanto en otros dominios. –

+0

Revisé esa discusión, pero creo que estoy de acuerdo con Nate. DI debe usarse para resolver e inyectar dependencias, pero si uno está creando cientos de miles de objetos a través de un contenedor DI, hay algo mal con el diseño general. Esa nunca fue la intención de DI. Podría haber agregado otra viñeta a mi lista: "Favorecer el desacoplamiento de dependencias volátiles sobre las dependencias estables", pero es más una recomendación de diseño general que una particular DI. –

+2

Acepto los objetos transitorios: la mayoría de las aplicaciones que usan DI crean grandes cantidades de objetos transitorios. Algunos contenedores (Unity y pronto Autofac 2) son por defecto transitorios en lugar de Singleton. No creo que se prefiera "preferir singletons" como una mejor práctica, parece más un comentario sobre el rendimiento de un contenedor específico en un escenario específico. –

4

Utilice el contenedor de DI para Singleton de larga duración sólo los objetos, las fábricas de uso (u otros métodos) para objetos transitorios de corta duración)

pero si use DI para inyectar las fábricas en donde se necesita .

Cuestiones relacionadas