2009-05-20 9 views

Odpowiedz

4

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.

1

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.

5

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.

2

(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.

1

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.

+0

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ą. –

Powiązane problemy