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?
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.
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.
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.
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
.
Tags und Links c++ dependency-injection pass-by-reference shared-ptr