Instancování pomocí továren v modelu

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

Ahoj,
uniká mi asi podstatná součást DI v nette. Továrničky, které si definuji v konfigu slouží k pohodlnějšímu instancování tříd, předávání závislostí atd., je to tak?
Pokud mám ale např. třídu NodeCollection (instancovanou taky přes továrnu v presenteru) a ta si vytvari instance tridy Node a v konfigu budu mit

factories:
	nodeCollection:
		class: NodeCollection(%rows%, @database)
		parameters: [rows]
	node:
		class: Node(%row%, @database)
		parameters: [row]

Jak instancuji Node v NodeCollection?

mkoubik
Člen | 728
+
0
-

Použij továrničky generované z interface (https://doc.nette.org/…tion/factory na konci) a předej si ten interface do Node třeba konstruktorem.

sitnarf
Člen | 27
+
0
-

mkoubik napsal(a):

Použij továrničky generované z interface (https://doc.nette.org/…tion/factory na konci) a předej si ten interface do Node třeba konstruktorem.

Díky za odpověď. Moc tomu nechápu, takže (reaguji na článek) ten konkretní mailingFactory mi vygeneruje DIC sám podle interface? A jak vybere konkrétní implementaci? Podle řádku /* @return Nette\Mail\Message */ v definice interfacu IMailingMessageFactory?

Editoval sitnarf (17. 7. 2013 19:52)

David Matějka
Moderator | 6445
+
0
-

presne tak, podle anotace @return urcis tridu, kterou budes vytvaret. pripadne nemusis psat anotaci a v neonu zapsat:

factories:
	fooFactory:
		class: Foo
		implement: FooFactory

pripadne muzes pridat setup metody, v konstruktoru vyzadat zavislosti, parametry, argumenty… nette potom samo vygeneruje tridu implementujici to rozhrani a registruje to jako sluzbu

Editoval matej21 (17. 7. 2013 21:11)

zimmi
Člen | 94
+
0
-

@matej21: Tenhle postup, pokud se nemýlím, funguje zatím jen ve vývojové verzi, ne?

David Matějka
Moderator | 6445
+
0
-

@zimmi: bohuzel ano, ale neni problem si factory napsat rucne, je vsak problem, ze musis zavislosti spravovat na obou mistech – v samotne tride a ve factory, v DIC factories se zavislosti v factory urceji podle tridy. jak teda muze vypadat vlastni neautomaticka create:

//trida, kterou bude factory vytvaret
class Foo
{
	public function __construct($parametr, Zavislost1 $zavislost1, Zavislost2 $zavislost2)
	{
		...
	}
}

//factory

class FooFactory
{
	$zavislost1;
	$zavislost2;
	public function __construct(Zavislost1 $zavislost1, Zavislost2 $zavislost2)
	{
		$this->zavislost1 = $zavislost1;
		$this->zavislost2 = $zavislost2;
	}

	public function create($parametr)
	{
		return new Foo($parametr, $this->zavislost1, $this->zavislost2);
	}
}

v neonu registrujes factory jako sluzbu:

services:
	fooFactory: FooFactory

pro porovnani jeste napisu, jak by stacilo zapsat pri pouziti DIC factories z devu:

//tovarna
interface FooFactory
{
	/**
	* @return Foo
	*/
	public function create($parametr);
}

registrace v neonu:

factories:
	fooFactory:
		implements: FooFactory
		class: Foo
		parameters: [parametr]
		arguments: [%parametr%]