Dependency injection mezi službami

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

Předpokládám, že už se tu asi něco podobného řešilo.

Líbí se mi způsob, jakým pomoci dependency injection můžu do presenteru „vstříknout“ libovolnou službu (service), bez nutnosti ji někdě složitě vyhledávat a „setovat“ ručně.

Chtěl bych tento mechanismus využít i mezi samotnými službami, mezi kterými u mě existují závislosti. To jsem si ale všiml, že nejde. Dokonce mi do služeb nejde nainjektovat ani DibiConnection, zatímco do presenterů ano. Je toto záměr, nebo něco dělám blbě?

Příklad

/** @var DibiConnection @inject */
public $db;

funguje vrámci Presenterů, ale ve službách je db vždy null

Editoval microcz (18. 5. 2014 18:37)

David Klouček
Člen | 57
+
+1
-

Od nový verze funguje @inject jen v presenterech, použij konstruktor.

microcz
Člen | 62
+
0
-

zeptám se, mělo to nějaký důvod?

Musím to nějak specifikovat v config.neon, kterou třídu do konstruktoru předat, nebo stačí když konstruktoru v deklaraci služby vytvořím parametr a vše se předá automaticky?

David Matějka
Moderator | 6445
+
0
-

Staci pokud uvedes v konstruktoru spravny typehint. Pak se zavislost preda automaticky. @inject anotace a podobne berlicky maji smysl pouze v presenterech, kde by hrozil nejaky dependency hell v konstruktoru, viz treba par dni stare tema https://forum.nette.org/…inych-sluzeb

sKopheK
Člen | 207
+
-1
-

Pokud chceš použít anotaci @inject i u služeb, musíš u jejich definice v configu kromě třídy zadat i povolení injectu.

services:
	Sluzba:
		class: namespace\Sluzba
		inject: yes
Jan Endel
Člen | 1016
+
+1
-

Ne, inject do služeb nepatří, prostě to tam nechceš. Máš to hezky vysvětleno na odkazu ve 4. příspěvku v tomto topicu.