Krótkie pytanie dotyczące najlepszej praktyki: Jeśli obiekt A zostanie wstrzyknięty do innego obiektu B, czy obiekt B powinien zostać wdrożony i zlikwidować A, gdy B zostanie ułożony?Czy wstrzyknięte właściwości należy usunąć?
Odpowiedz
Ogólnie powiedziałbym nie; charakter wstrzyknięcia zależności oznacza, że wstrzyknięty obiekt nie wie wiele o cyklu życia tego, co zostało wstrzyknięte; w pewnym stopniu jest to definicja wtrysku. W związku z tym nie sądzę, że wstrzyknięty przedmiot powinien usuwać wszystko, co zostało wstrzyknięte; kod wstrzykiwania powinien wziąć odpowiedzialność za znajomość całego cyklu życia wszystkich przedmiotów, które wstrzykuje, i powinien być w stanie odpowiednio je zutylizować, gdy wszystkie operacje na nich są zakończone, a nie wcześniej.
Myślę, że tak naprawdę stanie się to subiektywne.
Wszystko sprowadza się do tego, kto powinien kontrolować czas życia obiektu A?
Powiedzmy na przykład, że obiekt C i D również mają obiekt A do nich wstrzyknięty, w takim przypadku nie chcemy, aby obiekt B przedwcześnie pozbywał się obiektu A.
Jednak w niektórych przypadkach, gdy wiesz, żywotność obiektu A powinna kończyć B, to jest w pełni uzasadnione, aby obiekt B wyrzucać obiektu A.
Jeśli powołując się na wzór dependency injection, ja myślę, że to zależy od wiedzy w Obszarze B o implementacji Obiektu A. Powodem takiego zastrzyku zależności jest zwykle to, że nie wiesz wcześniej, jak obiekt A zostanie zaimplementowany i czy wymaga IDisposable. Jedyne, co wiesz, to interfejs.
Dodanie tego zachowania skutkowałoby ściślejszym sprzężeniem między dwiema klasami, IMO.
(edycja: podczas udzielania odpowiedzi, nie wydaje mi się jasne, że pytanie dotyczyło IoC/DI; zostawię to tutaj w celach informacyjnych, ale najpierw przyjrzyj się zaakceptowanej odpowiedzi).
Jeśli przez "wstrzyknięty" rozumie się, że B
przejmuje własność A
, to tak; Przykładem mogą być rzeczy takie jak StreamReader
.
Jeśli tylko wykorzystujeA
przez jakiś czas (ale A
nadal żyć poza B
) wtedy nie.
Niektóre interfejsy API pozwalają określić (na konstruktorze), czy należy przyjąć własność (tj. Czy wyczyścić wtryskiwany obiekt). Przykładem tego może być GZipStream
.
Moje 2p byłoby dowodzić, że A nie powinno być usuwane, gdy B jest zbywane. Cała idea zastrzyku uzależnienia polega na tym, że nie musisz się martwić o bahaviour i cykl życia przedmiotów, które otrzymujesz, po prostu przekazujesz je.
Następnie należy się upewnić, że obiekt zostanie oczyszczony, gdy tylko nie jest już potrzebny. Może stworzyć system mini-eventów, aby można było powiadomić, że należy go usunąć? Myślę, że to naprawdę zależy od kontekstu.
- 1. Czy można usunąć właściwości z klasy dynamicznej?
- 2. Jak zamówić wstrzyknięte pliki za pomocą Gulp?
- 3. jak czyściutko usunąć właściwości ndb
- 4. Czy możemy usunąć właściwości użytkownika z Firebase Analytics?
- 5. Czy należy ustawić AssemblyConfigurationAttribute?
- 6. Czy należy zagnieżdżać oczekiwane operacje?
- 7. Czy należy testować klasy modelu?
- 8. Czy należy odwrócić tekstury OpenGL?
- 9. Czy należy użyć UseLayoutRounding & SnapsToDevicePixels?
- 10. Czy przeciążalność należy wybrać Metody prywatne?
- 11. Kiedy należy utworzyć i usunąć obiekt PayPal WebProfile (PHP)
- 12. Które właściwości należy serializować/deserializować w klasie użytkowników Symfony 2?
- 13. Należy usunąć pierwsze N wierszy plików wynikowych grep
- 14. Czy moduły mogą mieć właściwości?
- 15. Jak usunąć wstrzyknięty plik CSS?
- 16. Czy zmienne instancji/klasy należy poprzedzać prefiksem w Delphi?
- 17. Czy przed zamknięciem należy zamknąć deskryptory plików?
- 18. Czy należy przesłonić service() lub doPost()?
- 19. Czy należy uczyć się angularjs bez jQuery?
- 20. Czy należy używać marynaty lub cPickle?
- 21. składni, należy sprawdzić, czy użytkownik jest zalogowany
- 22. Czy należy używać wtforms with Pylons?
- 23. Czy EF wtrąć należy zrobić ręcznie?
- 24. Czy * .datasource należy zignorować w kontroli wersji?
- 25. OpenGL - Czy należy przechowywać atrybuty/jednolite lokalizacje?
- 26. Przedmioty RX - czy należy ich unikać?
- 27. Czy w nazwach kolumn należy używać podkreśleń?
- 28. Czy należy umieszczać znaczniki akapitów wokół obrazów?
- 29. php - Czy należy szyfrować adresy e-mail?
- 30. Czy IDataErrorInfo.Error należy sprawdzić każdą właściwość?
W takim przypadku potrzebowałbyś pewnego rodzaju liczenia odwołań, więc obiekt A nie zostanie usunięty przed niektórymi klasami, które go używają. –