Краткая рекомендация: если объект A вводится в другой объект B, то должен ли объект B реализовать IDisposable и распоряжаться A, когда B расположен?Должны ли быть введенные свойства?
ответ
Я бы обычно сказал «нет»; природа инъекции зависимостей означает, что инъецируемый объект мало знает о жизненном цикле того, что он вводил; в некоторой степени это определение инъекции. Таким образом, я не думаю, что инъецируемый объект должен распоряжаться тем, что было введено; код инъекции должен нести ответственность за знание полного жизненного цикла всех объектов, которые он впрыскивает, и должен иметь возможность правильно распоряжаться ими, когда все операции над ними завершены, а не раньше.
Я думаю, что это действительно было бы субъективным.
Все это сводится к тому, кому следует контролировать срок службы объекта A?
Скажите, например, что объекты C и D также имеют объект A, введенный в них, в этом случае вы бы не захотели, чтобы объект B раньше убирал объект A.
Однако, в некоторых случаях, когда вы знаете, срок службы объекта А должен заканчиваться B, это вполне уместно, чтобы объект B распоряжаться объекта A.
Если вы имеете в виду dependency injection шаблон, я подумайте, что это зависит от знаний в Object B о реализации Object A. Причина для инъекции зависимостей, как это, обычно заключается в том, что вы заранее не знаете, как будет реализован Object A и требуется ли IDisposable. Единственное, что вы знаете, это интерфейс.
Добавление этого поведения приведет к более тесной связи между двумя классами, ИМО.
(отредактировано: при ответе на него мне не ясно, что вопрос о IoC/DI, я оставлю это здесь для справки, но сначала посмотрите на принятый ответ).
Если по "injected" вы имеете в виду, что B
предполагает собственность A
, тогда да; примером этого могут быть такие вещи, как StreamReader
.
Если он просто используетA
некоторое время (но A
продолжает жить дальше B
), то нет.
Некоторые API-интерфейсы позволяют указать (на конструкторе), следует ли предполагать право собственности (т. Е. Очистить вложенный объект). Примером этого может быть GZipStream
.
Мое 2p должно было бы утверждать, что A не следует удалять, когда B расположен. Вся идея инъекции зависимостей заключается в том, что вам не нужно беспокоиться о бахавире и жизненном цикле объектов, которые вы получаете, вы просто передаете их.
Затем вы хотите, чтобы объект очищался, как только он больше не требуется. Может быть, создать мини-систему событий, чтобы вы могли уведомить ее о необходимости ее удаления? Наверное, это зависит от контекста.
- 1. Должны ли быть освобождены свойства?
- 2. Неявно введенные локальные переменные должны быть инициализированы
- 3. Должны ли IBOutlets быть ivars или свойства?
- 4. Свойства IBOutlet должны быть неатомными?
- 5. только свойства должны быть удалены
- 6. Должны ли UIViews иметь свойства?
- 7. Неявно введенные локальные переменные должны быть инициализированы: определение области
- 8. Когда должны UIViewControllers быть объявлены как свойства
- 9. Должны ли быть отмечены мои свойства аккордов Akka @ volatile?
- 10. Должны ли быть заблокированы эти свойства статического приложения?
- 11. Должны ли свойства subview UIViewController быть неявно развернутыми опциями?
- 12. Должны ли мои свойства актеров Scala быть отмечены @ volatile?
- 13. Должны ли свойства когда-либо быть на прототипе?
- 14. Какие свойства должны быть проиндексированы в Realm?
- 15. Где должны быть размещены расчетные свойства?
- 16. где должны быть указаны свойства c3p0?
- 17. Должны ли интерфейсы определять свойства?
- 18. Должны ли аксессоры быть встроенными?
- 19. Должны ли NullRefs быть пойманы?
- 20. Должны ли быть исключены исключения
- 21. Должны ли деструкторы быть потокобезопасными?
- 22. Должны ли редукторы быть вложенными?
- 23. Введенные свойства управляемых объектов: nil
- 24. Должны ли объявляться свойства объекта в javascript?
- 25. Весенние сервисы должны быть сериализуемыми
- 26. Введенные данные Angularjs должны показать ссылку
- 27. Должны ли вы испытывать простые свойства?
- 28. Свойства класса модели должны быть частными или общедоступными?
- 29. Какие свойства элемента должны быть включены в json-схему?
- 30. Почему свойства навигации должны быть общедоступными для создания прокси-сервера?
В этом случае вам понадобится какой-то подсчет ссылок, поэтому объект A не будет удален до некоторых классов, использующих его. –