2011-04-20 15 views
8

En los casos en que se requiere la inyección de dependencia del constructor, ¿cuáles son las consideraciones para usar la inyección por referencia frente al uso de boost :: shared_ptr?Inyección de dependencia C++ - por referencia o por boost :: shared_ptr?

¿Existe alguna otra forma común de hacerlo? ¿Cómo se compara con los dos métodos anteriores?

+2

+1: ¡Me encanta la inyección de dependencia! – Nick

+0

Usar un puntero puede ayudar en ciertos escenarios. Consulte la respuesta siguiente para este caso al probar la clase: http://stackoverflow.com/questions/5726580/mocking-c-classes-with-dependency-injection/5836747#5836747 – Jonathan

Respuesta

5

Es su elección sobre cómo desea administrar la vida útil del objeto que está inyectando. La arquitectura general probablemente dictará qué elección tiene más sentido. Con una referencia, algo en un nivel superior debe administrar la vida del objeto; con shared_ptr la vida útil se administrará automáticamente.

2

Anteriormente he usado ambos métodos.

La ventaja de utilizar el enfoque de puntero compartido significa que puede pasar la propiedad de las dependencias inyectadas al consumidor.

Si utiliza el enfoque basado en la referencia, la destrucción de las dependencias inyectadas es mucho más determinista. Es decir. ocurre una vez que se ha completado todo el procesamiento en los consumidores.

2

Recuerdo ver algún código que lo hizo con unique_ptr (o quizás auto_ptr). Esto parece ser mejor que "por referencia": no hay necesidad de administrar la propiedad del objeto inyectado. Esto podría ser más rápido que usar shared_ptr: no se requiere conteo de referencias. Sin embargo, esto podría ser más confuso: implica la transferencia de propiedad, y auto_ptr tiene algunos inconvenientes.

+0

'unique_ptr' y' auto_ptr' no lo hacen te da la posibilidad de compartir el objeto. De nuevo, si esto será un problema depende de la arquitectura general. –

+1

Es una buena opción si el objeto posee (no comparte) el objeto inyectado. –

-1

La pregunta que debe hacerse es: ¿a quién pertenece el objeto? En un escenario de DI típico, es el objeto de consumo. En ese caso, pasaría un puntero sin formato al constructor y lo almacenaría en algo como unique_ptr. Si la propiedad se comparte o no está clara, por supuesto, use shared_ptr.

+0

¿Eh? Nunca debe * ser el consumidor en DI. ¿Qué pasa si otros objetos necesitan usar también esa instancia? –

+0

@BlueRaja: Estrictamente hablando, puede ser de cualquier manera: DI es ortogonal al dilema de agregación vs. composición. –

+0

Nunca pasaría un puntero SIN PROCESAR. Si nada más encierra un puntero en un puntero inteligente proporciona documentación (en la fuente) de lo que se supone que le pasará al objeto pasando RAW p; punteros es simplemente horrible y confuso. –

Cuestiones relacionadas