php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.01.2012, 20:07  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard DI-Container und Singleton - Per Konfiguration oder "on Demand"

Hallo,

ins Rollen kamen meine Überlegungen, als ich die Methode meines DI-Containers (ServiceContainers) "get()" überdachte, um an ein Objekt des Services zu gelangen.

Im konkreten Fall ging es darum, vom Controller aus eine weitere View zu instanziieren. Die Methode "get()" wirkt hier etwas irreführend auf mich, da man, genau betrachtet, ja kein Objekt erhalten möchte, sondern explizit ein neues erstellen möchte. Ich kam erst auf die Idee, eine Alias-Methode "create()" bereitzustellen, die genau das gleiche tut.

Aber dann dachte ich daran, get() und create() logisch zu trennen: get() würde demnach explizit eine Singleton-Instanz erstellen, create() ein neues Objekt. Das würde aber meinem Grundsatz widersprechen, dass der Service selbst (z.B. via Konfiguration) festlegt, ob er als Singleton abgerufen wird oder nicht.

Wie seht ihr das? Sollten Singleton-Instanzen aus dem DI-Container "on demand" erfolgen? Wenn ja, würde euch stören, ein get() zu benutzen, wenn etwas neues erstellt werden soll?
__________________
dsentker ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.01.2012, 20:12  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich finde ja nicht, dass eine Bezeichnerdiskussion ins FG-Forum gehört. Aber naja. Meinetwegen kannst Du das auch fetch() oder retrieve() oder anders nennen, aber get() finde ich recht naheliegend. Ein Service-Container, der immer eine neue Instanz liefert, will mir keinen rechten Sinn ergeben.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.01.2012, 20:25  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Ich finde ja nicht, dass eine Bezeichnerdiskussion ins FG-Forum gehört. Aber naja.
Wenn ich falsch kategorisiert habe, tut es mir leid, jedoch denke ich nicht dass Anfänger etwas mit einem ServiceContainer anfangen können. Es geht ja außerdem nicht nur um die Frage zur Benennung einer Methode, sondern ob eine Singleton-Instanz für den Container fest in der Config verankert sein soll.

Zitat:
Zitat von nikosch Beitrag anzeigen
Meinetwegen kannst Du das auch fetch() oder retrieve() oder anders nennen, aber get() finde ich recht naheliegend. Ein Service-Container, der immer eine neue Instanz liefert, will mir keinen rechten Sinn ergeben.
Nein, nicht immer. Aber dann, wenn der Service es per Konfiguration veranschlagt hat. Es bleibt eben nur die Frage, ob man das nicht bei Bedarf entscheidet (quasi in der betreffenden Controller-Action, z.B.)
__________________
dsentker ist offline   Mit Zitat antworten
Alt 08.01.2012, 20:46  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von dsentker Beitrag anzeigen
Die Methode "get()" wirkt hier etwas irreführend auf mich, da man, genau betrachtet, ja kein Objekt erhalten möchte, sondern explizit ein neues erstellen möchte.
Im Kontext eines DI-Containers betrachte ich die get()-Methode differenzierter. Sofern zur Laufzeit ein bestimmter Service zum ersten Mal angefordert wird, wird in der Tat ein neues Objekt erstellt und zurückgegeben. Sofern der Service zum wiederholten Male angefordert wird, würde ich schon davon sprechen, dass ich mit dem Aufruf der get()-Methode ein bestimmtes Objekt erhalten möchte. Demnach kann ich deine Auffassung bezüglich der get()-Methode nicht ganzheitlich teilen.

Schon mal darüber nachgedackt, via get() eine Factory anzufordern?
Trainmaster ist offline   Mit Zitat antworten
Alt 08.01.2012, 20:56  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Im Kontext eines DI-Containers betrachte ich die get()-Methode differenzierter. Sofern zur Laufzeit ein bestimmter Service zum ersten Mal angefordert wird, wird in der Tat ein neues Objekt erstellt und zurückgegeben. Sofern der Service zum wiederholten Male angefordert wird, würde ich schon davon sprechen, dass ich mit dem Aufruf der get()-Methode ein bestimmtes Objekt erhalten möchte. Demnach kann ich deine Auffassung bezüglich der get()-Methode nicht ganzheitlich teilen.
Damit meinst du also, dass im Zusammenhang mit einem DI-Container "get()" durchaus für eine neue Instanz stehen könnte?

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Schon mal darüber nachgedackt, via get() eine Factory anzufordern?
Ehrlich gesagt, nein. Das liegt aber zum einen vielleicht daran, dass
a) man ja durchaus die Factory als Service definieren kann und
b) ich eh kaum mit Factories arbeite
__________________
dsentker ist offline   Mit Zitat antworten
Alt 08.01.2012, 21:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Fände ich hier aber konsequenter, wenn Du immer neue Instanzen benötigst.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.01.2012, 21:05  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Okay, in der Tat könnte die View eine Factory gebrauchen. Es muss ja allerhand zugewiesen werden, etwa der Renderer, die Konfigruation etc.

Meine View erfordert im Konstruktor die Angabe einer Konfiguration sowie die eines Renderers.
Ich handhabte es so, dass die Config und der Renderer selbst ein Service ist. Per DI krallt sich der Service "View" also den Service "Config" und "ViewRenderer". Ist das denn so falsch?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 08.01.2012, 21:10  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von dsentker Beitrag anzeigen
"get()" durchaus für eine neue Instanz stehen könnte
Streng genommen steht sie für eine neue Instanz, sofern der Service zum ersten Mal angefordert wird. Bis zu diesem Zeitpunkt besteht noch keine Instanz des angeforderten Service. Der erstmalige Aufruf bewirkt, dass eine neue Instanz des angegebenen Objekts erzeugt wird. Bei allen weiteren Aufrufen wird eben diese Instanz zurückgegeben. So jedenfalls habe ich das Konzept eines DI/Service-Containers verstanden.
Trainmaster ist offline   Mit Zitat antworten
Alt 08.01.2012, 21:22  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Bei allen weiteren Aufrufen wird eben diese Instanz zurückgegeben
Bist du dir sicher? Ein DI-Container kann doch nicht nur Singletons...?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 08.01.2012, 22:26  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Bist du dir sicher? Ein DI-Container kann doch nicht nur Singletons...?
Dann ist das aber nicht nur ein DI-Container, sondern auch ein service locator und eine abstract factory...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
CSS alphatranzparenz nicht an eingeschlossene container vererben litterauspirna HTML, Usability und Barrierefreiheit 7 03.11.2011 10:57
[CSS] Container in Container Igäl HTML, Usability und Barrierefreiheit 5 04.09.2007 11:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
schwerlastrollen für container bis 1t, php di-container

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:50 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum