C ++ - Abhängigkeitsinjektion - durch Referenz oder durch boost :: shared_ptr?

8

In Fällen, in denen eine Abhängigkeitsinjektion von Konstruktoren erforderlich ist, welche Überlegungen gelten für die Verwendung der Injektion durch Referenz oder die Verwendung von boost :: shared_ptr ?

Gibt es einen anderen üblichen Weg? Wie ist es mit den beiden obigen Methoden zu vergleichen?

    
Jonathan 20.04.2011, 15:31
quelle

4 Antworten

5

Sie haben die Wahl, wie Sie die Lebensdauer des Objekts, das Sie injizieren, verwalten möchten. Die Gesamtarchitektur wird wahrscheinlich diktieren, welche Wahl am sinnvollsten ist. Mit einer Referenz muss etwas auf einer höheren Ebene die Objektlebensdauer verwalten; Mit shared_ptr wird die Lebensdauer automatisch verwaltet.

    
Mark Ransom 20.04.2011, 15:36
quelle
2

Bisher habe ich beide Methoden verwendet.

Der Vorteil der Verwendung des Shared-Pointer-Ansatzes bedeutet, dass Sie die Eigentumsrechte an den injizierten Abhängigkeiten an den Konsumenten weitergeben können.

Wenn Sie den referenzenbasierten Ansatz verwenden, ist die Zerstörung der injizierten Abhängigkeiten viel deterministischer. I.e. Es tritt auf, sobald alle Verarbeitung in den Verbrauchern abgeschlossen ist.

    
Nick 20.04.2011 15:41
quelle
2

Ich erinnere mich an Code, der es mit unique_ptr (oder vielleicht auto_ptr ) gemacht hat. Dies scheint besser zu sein als "per Referenz": Es besteht keine Notwendigkeit, das Eigentum des injizierten Objekts zu verwalten. Dies ist möglicherweise schneller als die Verwendung von shared_ptr : Es ist keine Referenzzählung erforderlich. Dies könnte jedoch verwirrender sein: Es beinhaltet Besitzübertragung, und auto_ptr hat einige Fallstricke.

    
anatolyg 20.04.2011 16:11
quelle
-1

Die Frage, die Sie sich stellen müssen, lautet: Wem gehört das Objekt? In einem typischen DI-Szenario ist dies das Consumer-Objekt. In diesem Fall würde ich einen rohen Zeiger an den Konstruktor übergeben und ihn in etwas wie unique_ptr speichern. Wenn der Besitz freigegeben oder nicht klar ist, verwenden Sie shared_ptr .

    
Nemanja Trifunovic 20.04.2011 16:26
quelle