Dependency inejction a služba jako singleton
- Azathoth
- Člen | 495
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?
- Azathoth
- Člen | 495
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
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
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)