Dependency inejction a služba jako singleton

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Azathoth
Člen | 495
+
0
-

Zdravím,
chtěl bych se zeptat, jelikož jsem to nikde nemohl najít přesně, tak se radši ptám: Když zaregistruji službu C a poté službu C mám jako závislost ve službách A a B, tak se vždy při samotném DI vytvoří pro službu A i pro službu B nová instance služby C a nebo služba A i B mají stejnou instanci služby C, takže je v tu chvíli služba C singleton?

Jan Endel
Člen | 1016
+
+1
-

A i B mají stejnou instanci C.

Azathoth
Člen | 495
+
0
-

Děkuji. Byl jsem trochu totiž zmaten po přečtení článku singleton je zlo, kde to vypadalo, že v Nette se singletony vůbec neobjevují a potom zjistím, že se takhle krásně šetří výkon tím, že služby jsou singletony.
Tak mne napadá: čím se liší služba v Nette jako singleton a singleton popisovaný ve výše uvedeném článku?

Šaman
Člen | 2665
+
+2
-

Singleton nesmí mít více instancí, zatímco u služeb se prostě jen předává jediná instance, protože není důvod jich vytvářet víc. Ale kdyby bylo potřeba, klidně si můžeš vytvořit druhý router, authenticátor, model… pod jiným jménem a předávat jako závislost jeden automaticky a druhý (třetí, čtvrtý) pomocí jména.

Jinak řečeno, singleton nesouvisí s frameworkem – je to objekt, který, pokud již jedna instance existuje, vyhazuje výjimku při pokusu o další volání konstruktoru.

<?php
$singleton1 = new Singleton; # ok
$singleton2 = new Singleton; # výjimka!

$service1 = new Service; # ok
$service2 = new Service; # ok
$service3 = new Service; # ok
?>

Ale dokud není důvod vytvářet jich víc, vytvoří se a předává jen jediná.

// dodatek: Singleton je zlo, protože se za prvé špatně kontroluje, že existuje jen jediná instance (musí se zamezit i klonování, nebo wake uloženého freeze objektu). A za druhé občas potřebuješ druhou instanci, třeba jako testovací (místo pravého modelu můžeš občas chtít podstrčit testovací třídu, která vrací předem připravené výsledky).

Editoval Šaman (19. 8. 2014 14:30)

David Matějka
Moderator | 6445
+
0
-

Ty sluzby jsou (mohou byt) „singlentony“, ale nejsou „Singlentony“. Rozdil je v tom, ze ani sluzba, ani jeji klient o tom nevi – o jedinecnosti te sluzby vi (a stara se o ni) pouze DI kontejner.

Proti tomu, navrhovy vzor „Singlenton“ vetsinou spociva v tom, ze sluzba/trida si sama hlida svoji jedinecnost a jeji klient na to spoleha a jeji instanci si ziskava treba pomoci Foo::getInstance()

Editoval matej21 (19. 8. 2014 14:30)