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

- Pablo
 - Člen | 2
 
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
 
Š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.