Внедрение зависимостей C ++ - по ссылке или с помощью boost :: shared_ptr? - PullRequest
8 голосов
/ 20 апреля 2011

В тех случаях, когда требуется внедрение зависимости конструктора, каковы соображения для использования внедрения по ссылке по сравнению с использованием boost :: shared_ptr ?

Есть ли ещеобщий способ сделать это?Как это соотносится с двумя методами выше?

Ответы [ 4 ]

5 голосов
/ 20 апреля 2011

Это ваш выбор того, как вы хотите управлять временем жизни объекта, который вы вводите.Общая архитектура, вероятно, будет определять, какой выбор имеет наибольшее значение.Со ссылкой что-то на более высоком уровне должно управлять временем жизни объекта;с shared_ptr время жизни будет управляться автоматически.

2 голосов
/ 20 апреля 2011

Я помню какой-то код, который делал это с unique_ptr (или, может быть, auto_ptr). Похоже, это лучше, чем «по ссылке»: нет необходимости управлять владельцем введенного объекта. Это может быть быстрее, чем при использовании shared_ptr: подсчет ссылок не используется. Это может быть более запутанным, хотя: оно предполагает передачу права собственности, и у auto_ptr есть некоторые подводные камни.

2 голосов
/ 20 апреля 2011

Ранее я использовал оба метода.

Преимущество использования подхода с общим указателем означает, что вы можете передать владение внедренными зависимостями потребителю.

Если вы используете ссылку на основеПодход, тогда уничтожение введенных зависимостей гораздо более детерминирован.Т.е. это происходит после того, как вся обработка у потребителей завершена.

0 голосов
/ 20 апреля 2011

Вопрос, который вам нужно задать себе: кто владеет объектом?В типичном сценарии DI это потребительский объект.В этом случае я бы передавал необработанный указатель на конструктор и сохранял бы его во что-то вроде unique_ptr.Если право собственности разделено или неясно, чем, конечно, используйте shared_ptr.

...