predavanie $container serviceom bez factory

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

ahojte, neviem ci to je blbost ale mne sa to zda celkom ok, aby sa serviceom, ktore nemaju definovanu factory predaval do konstruktoru automaticky $container
teda namiesto

<?php
$container->addService('Sluzba', function($container) {
	$class = 'Sluzba'; $service = new $class();
	return $service;
}, NULL);
?>

by to bolo

<?php
$container->addService('Sluzba', function($container) {
	$class = 'Sluzba'; $service = new $class($container);
	return $service;
}, NULL);
?>

co myslite?

xificurk
Člen | 121
+
0
-

bazo napsal(a):

co myslite?

že je to nesmysl

Filip Procházka
Moderator | 4668
+
0
-

Jde to proti DI, takže je to nesmysl.

Petr Motejlek
Člen | 293
+
0
-

@bazo: Automaticky rozhodně ne. To bys pak zbytečně po všech třídách, co chceš mít jako službu, musel požadovat, aby s Nette DI počítaly, a to je úplně proti filozofii DI. Hezčí a srozumitelnější bude, když si uděláš vlastní továrnu. Do továrny se IContainer automaticky předává.

bazo
Člen | 620
+
0
-

@hosiplan: cim to ide proti DI?
@petr motejlek: ked do konstruktoru nenapisem, ze prijima Nette\DI, nic sa nestane predsa. sposob ako predavat ine parametre nevidim. a mne pride hezci kvoli predavaniu $container nevyrabat pre kazdu sluzbu vlastnu tovarnicku

Filip Procházka
Moderator | 4668
+
0
-

Ale ty přece nemáš předávat Container. Máš předávat několik služeb třídě. Víc nemá potřebovat. Pokud ti to nevyhovuje, vrať se k Nette\Environment::getService()

juzna.cz
Člen | 248
+
0
-

Tento clanek je sice o singletonech, ale kdyz si ho prectes, tak ti odpovi i na otazku proc je toto spatne.

bazo
Člen | 620
+
0
-

ok, ok, ukecali ste ma. este sa opytam aky sposob tovarniciek je preferovany? vsetky do jednej statickej triedy alebo pre kazdy service vlozit staticku metodu priamo do classy toho serviceu?

Dragon Jake
Člen | 20
+
0
-

to druhé

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud vím, tak Nette DI kontejner podporuje továrničky v podobě anonymních funkcí.

Puristické řešení podle nejlepších teoretických úmyslů™ je mít pro každou servisu, kterou chceme instanciovat přes továrničku, mít ještě samostatný objekt s příponou Factory. Snadno se to pak konfiguruje.

Teyras
Člen | 81
+
0
-

Kdybych měl mít ve třídě továrničku na sebe samou, je už celkem fuk, jestli $container dostává factory a nebo konstruktor, porušení DI je to úplně stejné. Podle mého je nejlepší container nepředávat vůbec a předávat konstruktoru rovnou služby…