Návrh modelu s viacerými príbuznými triedami a DI

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

Aký je správny spôsob vytvárania modelu v takejto teoretickej situácií:

  • Majme 2 triedy: Kniha a Autor
  • Kniha má dve závislosti, ktoré očakáva v konštruktore: objekt ZdrojDátOKnihách1 a objekt ZdrojDátOKnihách2
  • Autor má iba jednu závislosť, ktorú rovnako očakáva v konštruktore: ZdrojDátOAutoroch

V configu si viem veľmi jednoducho vytvoriť továrničky na obe triedy:

factories:
	kniha: Kniha(@zavislost1, @zavislost2)
	autor: Autor(@zavislost3)

Čo ale v prípade, ak má Autor metódu napísanéKnihy a Kniha metódu autor? Obe metódy by mali vrátiť objekt druhej triedy, ako sa ale dostanú k továrničke, ktorá sa postará o injektovanie závislostí?

Prípadne, ak je toto nesprávny prístup k návrhu modelu, ako by sa takáto situácia mala ideálne riešiť?

Editoval Pablo (29. 3. 2012 23:17)

Filip Procházka
Moderator | 4668
+
0
-

Špatně, protože vytvářet entity ve factories nedává smysl.

Lepší je mít nějaký model, který je bude obsluhovat a předat závislosti jemu. Takový model pak závislosti může předat i konkrétní entitě, ale máš tu výhodu, že model samotný můžeš předat jinému. Zastane tedy roli, do které jsi postavil DIC tím, že se v něm snažím vytvářet entity a musel bys ho předávat do služeb.

Konkrétně:

class Books
{
	public function __construct($one, $two, $authors);

	public function create()
	{
		return new Book($this->one, $this->two, $this->authors->find(123));
	}
}

class Authors
{
	public function __construct($three);

	public function create()
	{
		return new Author($this->three);
	}
}

A v configu

services:
	books: Books(@one, @two, @authors)
	authors: Authors(@three)

Takto si můžeš entity vyžádat i jinde.

Pablo
Člen | 2
+
0
-

Och, aké jednoduché, ďakujem! :)