![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 1 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam problem wynikający z braku doświadczenia. Już wcześniej się z nim spotykałem ( nie warto pisać jak go rozwiązywałem) teraz chciałbym dowiedzieć się jak to powinno być implementowane.
Problem dotyczy prawie każdej bazy danych, bo do każdej stworzona jest klasa do obsługi(API -> PDO, MongoClient, Predis ). I teraz pytanie brzmi jak tego używać ? W przykładzie posłużę się Predis. https://github.com/nrk/predis
Rozwiązanie w którym w każdym miejscu gdzie będę chciał użyć redis muszę tworzyć nową instancje redis wydaje mi się dziwne. Każda z takich bibliotek powinna być obudowana własną która implementuje daną bibliotekę jako singleton ? Nie potrzebuje dokładnej odpowiedzi jak to powinno być zrobione. Np wystarczy mi wasze doświadczenie. Jak wy używacie PDO ? Ten post edytował tadeurz 21.07.2013, 08:58:19 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 550 Pomógł: 75 Dołączył: 5.06.2012 Skąd: Lębork Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 1 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak mogę tak zrobić.
W takim przypadku w konstruktorze każdej klasy wymagającej $redis musiałbym dodawać argument, lub dziedziczyć tą klasę z klasy gdzie ten obiekt jest już dostępny. (IMG:style_emoticons/default/tiredsmiley.gif) Do tej pory najbardziej przekonany jestem do zrobienia z $redis obiektu globalnego. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 550 Pomógł: 75 Dołączył: 5.06.2012 Skąd: Lębork Ostrzeżenie: (0%) ![]() ![]() |
Singleton też nie jest złym rozwiązaniem z tego co się orientuję.
Tutaj nie ma co marudzić tylko przerabiać jeżeli chce się mieć poprawnie. Ten post edytował Wazniak96 21.07.2013, 07:47:47 |
|
|
![]()
Post
#5
|
|
Grupa: Administratorzy Postów: 1 552 Pomógł: 211 Dołączył: 7.07.2009 Skąd: NJ ![]() |
To czy zrobisz to za pomocą wstrzykiwania (z wykorzystaniem metody, atrybutu lub przez konstruktor) czy jak wspomniano sprawisz, że klasa dla której wywołujesz nową instancję najpierw sprawdzi czy już takiej nie ma, żeby ją zwrócić - nie jest istotne.... bo zawsze będzie to lepsze od obiektu globalnego (IMG:style_emoticons/default/wink.gif) .
Nie znam całej apki, ale przecież nie wszędzie potrzebujesz dostępu do $redis no i często klasy logiki i tak dziedziczą. No i przede wszystkim: Temat: Jak poprawnie zatytulowac watek |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 1 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Czyli:
-> GLOBAL jest złym pomysłem, jak zawsze zresztą (IMG:style_emoticons/default/biggrin.gif) -> tworzenie nowej instancji obiektu za każdym razem też jest złe $redis Wstrzyknięcie $redis to jakiegoś commonAction/commonModel to dobry pomysł. Ten post edytował tadeurz 21.07.2013, 09:07:02 |
|
|
![]()
Post
#7
|
|
Grupa: Administratorzy Postów: 1 552 Pomógł: 211 Dołączył: 7.07.2009 Skąd: NJ ![]() |
Wstrzyknięcie lub po prostu tworzysz coś na kształt:
Kod if (nie mam własnej instancji) dla klasy typu redis z prywatnym konstruktorem (żebyś się przypadkiem nie zagalopował) i statyczną metodą + statycznym atrybutem $redis, w którym przechowujesz instancję.{ stwórz instancję; zapisz ją do statycznego atrybutu $redis; zwróć $redis; } else { zwróć $redis; } Wtedy z każdym wywołaniem klasy redis nie stworzysz nowego obiektu (bo nie jest to możliwe) i dostaniesz ten sam. Możesz to organizować w kontenerach lub nie, w zależności od potrzeb. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 1 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Pod dłuższym zastanowieniu i próbie przelania tego na kod nie pozostaje nic innego jak zrobić z tego to o czym Ty piszesz : singleton. A forma jego wstrzyknięcia pozostaje do wyboru. Mylę się czy zdanie w pierwszym poście jest bardzo dobrym spostrzeżeniem/radą ? Rozwiązanie w którym w każdym miejscu gdzie będę chciał użyć redis muszę tworzyć nową instancje redis wydaje mi się dziwne. Każda z takich bibliotek powinna być obudowana własną która implementuje daną bibliotekę jako singleton ?
|
|
|
![]()
Post
#9
|
|
Grupa: Administratorzy Postów: 1 552 Pomógł: 211 Dołączył: 7.07.2009 Skąd: NJ ![]() |
Nie wiem za bardzo co masz na myśli w tym zdaniu (IMG:style_emoticons/default/smile.gif) . Jeżeli klasę redis masz już podpiętą, to nie musisz jej nigdzie wstrzykiwać. W klasie, w której jest potrzebna wywołujesz np. redis::getInstance() i jako zwrot otrzymujesz instancję.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 22:31 |