2012-02-16 19 views
10

Używam koncepcji DI od jakiegoś czasu, ale teraz zaczynam używać kontenera wtrysku zależności (DIC). Chociaż jedno nie jest dla mnie jasne.Jak zachować instancję kontenera Injection Injection (PHP)?

W moim DIC przechowuję (na przykład) obiekt Config i obiekt Request. Rozumiem, że te obiekty w zakresie żądania (ta sama instancja jest używana za każdym razem, gdy żądasz jej z tego kontenera) pozostają takie same. Ale dzieje się tak tylko wtedy, gdy ponownie wykorzystam to samo wystąpienie DIC.

Jak powinienem przekazać DIC wokół moich zajęć? Powiedz, że chcę go użyć w mojej klasie Router, czy muszę go przekazać w konstruktorze mojej klasy Routera? Ale klasa Router jest tworzona w innej klasie i ta powinna już mieć ten obiekt DIC.

Czy powinienem utworzyć singleton tego DIC?

Odpowiedz

7

Nie jedź na trasę Singleton. Skutecznie wykorzystuje wszystkie zalety DIC. Zwykle przekazujesz kontener do konstruktora lub, jeśli to możliwe, jako parametr metody.

Tak, wymaga to dodatkowego wysiłku przy przekazywaniu obiektu kontenera wokół aplikacji, ale w efekcie kod ten dobrze odzwierciedla fakt, że te klasy zależą od tego obiektu.

+1

Najlepszym sposobem jest utworzenie DIC w bootstrapie mojej aplikacji i przekazanie go w razie potrzeby? Wydaje się, że to dobre podejście, ale muszę włożyć w to dodatkowy wysiłek. (Moje klasy będą również bardzo testowalne) – jayv

+0

Dla kontenera, który jest używany przez całą aplikację, co może być całkiem dobrym pomysłem. Skutecznie hermetyzuje zasoby/obiekty, które w innym wypadku musiałyby zostać wyeksponowane jako zmienne globalne lub Singletony. Pamiętaj, że możesz także mieć "lokalne" kontenery DI o ograniczonym zakresie użytkowania. Te powinny być tworzone w sposób, w którym są wymagane. – Mchl

+0

Czy możesz podać mi krótki praktyczny przykład użycia ograniczonego zakresu? – jayv