Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> ServiceLocator - czy dobrze rozumiem temat?
czychacz
post 14.03.2015, 17:35:00
Post #1





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Czy jest mi ktoś w stanie powiedzieć, czy dobrze rozumiem?
Service Locator w moim rozumieniu działa jako "baza" obiektów wytworzonych dla działania konkretnych części aplikacji. Z tego, co widziałem w przykładach, jest to implementowane w stylu:
  1. class sl
  2. {
  3. public function getDB()
  4. {
  5. return new DB();
  6. }
  7.  
  8. public function getCostam()
  9. {
  10. return new Costam();
  11. }
  12. }

ale w tym przykładzie zwracane są nowe instancje.
Czy wzorzec ten opiera się też o zwracanie obiektów podobnie do działania Singletonu? A może to już inny wzorzec?
Powiedzmy, że do powyższej klasy dodalibyśmy właściwość
  1. protected $instances = [];

a na przykład w getDB() sprawdzalibyśmy, czy $instances posiada już instancję konkretnego obiektu, i jeśli tak, to zwraca właśnie ją, a w przeciwnym wypadku tworzy nową i dopisuje ją do indexu.
Powyższy przykład to TYLKO PRZYKŁAD - więc uwagi typu "użyłbym innej metody faktoryzującej" raczej nic nie wniosą - chcę się dowiedzieć tylko, czy dobrze pojmuję temat.

//edit: jeśli przechowywałby instancje, to chyba byłoby w konflikcie z wzorcem Registry - ale czy oba na raz można użyć dla jednego celu?

Ten post edytował czychacz 14.03.2015, 17:36:07
Go to the top of the page
+Quote Post
MLukasz
post 20.03.2015, 09:15:09
Post #2





Grupa: Zarejestrowani
Postów: 21
Pomógł: 2
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


Hej,

Wg mojego rozumienia to co napisałeś, to prosty DI container. Do wzorca service locator dojdziesz, umożliwiając użycie tego containera obiektom, które nie powinny o nim wiedzieć, np. wstrzykując go jako zależność lub pakując w singleton.
Go to the top of the page
+Quote Post
Crozin
post 20.03.2015, 10:58:41
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


To czy metoda getServiceAbc() zwróci każdorazowo nowy obiekt czy wykorzysta już istniejący nie ma znaczenia z punktu widzenia tego (anty)wzorca. Część może działać tak, część inaczej. Generalnie Twój przykład jest poprawny.

SL nie stoi w sprzeczności z rejestrem, przy czym może go wykorzystywać własnie na przykład w celu zwracania tych samych obiektów usług.

Ten post edytował Crozin 20.03.2015, 10:58:48
Go to the top of the page
+Quote Post
Skie
post 23.03.2015, 15:25:35
Post #4





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


ServiceLocator jest to wzorzec, którego zadaniem jest przejęcie kontroli nad tworzeniem obiektów (serwisów), o które go poprosisz, wraz ze wszystkimi dependency które te obiekty potrzebują. To czy za każdym razem zwróci nowy obiekt, czy będzie je pobierał z jakiejś puli obiektów, czy może będzie to multiton, singleton czy customowa fabryka obiektów to już szczegóły implementacyjne. Większość szanowanych się ServiceLocatorów pozwala zdefiniować w bootstrapie config, w którym możesz określić które obiekty jak mają być tworzone, np.

"jeżeli programista poprosi o obiekt A, stwórz nowy A, za kazdym razem
jeżeli programista poprosi o obiekt B, stwórz B jeśli nie istnieje i go zapamiętaj, jeśli istnieje zwróć ten zapamiętany"
itd.

Różni się od Dependency Injection kierunkiem przepływu informacji. W przypadku ServiceLocatora, to dana klasa go odpytuje o obiekty. W przypadku DependencyInjection, wszystkie potrzebne obiekty są injectowane do wewnątrz tworzonej klasy.

ServiceLocator z punktu implementacyjnego może przypominać albo być wręcz identyczny z rejestrem, ale cel działania jest inny.
1. ServiceLocator definiuje metody tworzenia obiektów (posiadających logikę), gdy rejestr definiuje dostęp do statycznych wartości i modeli (nie posiadajacych logiki).
2. ServiceLocator ma na starcie aplikacji zdefiniowany config, który nie zmienia się w trakcie działania aplikacji i po fazie bootstrapu jest w pełni funkcjonalny, rejestr z kolei może zmieniać swój stan (zapamiętane wartości) cały czas w trakcie działania aplikacji.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.05.2025 - 07:47