2011-04-20 13 views
8

Nei casi in cui è richiesta l'iniezione dipendente dal costruttore, quali sono le considerazioni sull'utilizzo dell'iniezione tramite il riferimento rispetto all'utilizzo di boost :: shared_ptr?Iniezione dipendenza C++ - per riferimento o per boost :: shared_ptr?

C'è un altro modo comune per farlo? Come si confronta con i due metodi sopra?

+2

+1: Amo l'iniezione di dipendenza! – Nick

+0

L'uso di un puntatore può aiutare in determinati scenari. Vedere la risposta seguente per un simile caso durante il test della classe: http://stackoverflow.com/questions/5726580/mocking-c-classes-with-dependency-injection/5836747#5836747 – Jonathan

risposta

5

È la tua scelta su come si desidera gestire la durata dell'oggetto che si sta iniettando. L'architettura generale probabilmente imporrà quale scelta abbia più senso. Con un riferimento, qualcosa a un livello superiore deve gestire la durata dell'oggetto; con shared_ptr la durata sarà gestita automaticamente.

2

In precedenza ho utilizzato entrambi i metodi.

Il vantaggio di utilizzare l'approccio del puntatore condiviso significa che è possibile passare la proprietà delle dipendenze iniettate al consumatore.

Se si utilizza l'approccio basato sul riferimento, la distruzione delle dipendenze iniettate è molto più deterministica. Cioè si verifica una volta completata tutta l'elaborazione nei consumatori.

2

Ricordo di aver visto un codice che lo faceva con unique_ptr (o forse auto_ptr). Questo sembra essere meglio di "per riferimento": non è necessario gestire la proprietà dell'oggetto iniettato. Questo potrebbe essere più veloce rispetto all'utilizzo di shared_ptr: non è coinvolto il conteggio dei riferimenti. Ciò potrebbe tuttavia essere più confuso: comporta il trasferimento della proprietà e auto_ptr presenta alcune insidie.

+0

'unique_ptr' e' auto_ptr' non darti la possibilità di condividere l'oggetto. Di nuovo, se questo sarà un problema dipende dall'architettura generale. –

+1

È una buona scelta se l'oggetto possiede (non condivide) l'oggetto iniettato. –

-1

La domanda che devi porsi è: chi possiede l'oggetto? In un tipico scenario DI, è l'oggetto consumatore. In tal caso, passarei un puntatore raw al costruttore e lo memorizzerò in qualcosa come unique_ptr. Se la proprietà è condivisa o non chiara, ovviamente utilizzare shared_ptr.

+0

Eh? Dovrebbe * mai * essere il consumatore in DI - e se altri oggetti dovessero usare anche quell'istanza? –

+0

@BlueRaja: Strettamente parlando, può essere in entrambi i modi: DI è ortogonale al dilemma di aggregazione e composizione. –

+0

Non avrei mai passato da nessuna parte un puntatore RAW. Se nient'altro che avvolge un puntatore in un puntatore intelligente fornisce la documentazione (nell'origine) di ciò che dovrebbe accadere all'oggetto che passa RAW p, i puntatori sono semplicemente orribili e confusi. –

Problemi correlati