Implementace ORM s Dependency Injection

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

Dobrý den, chci zavést v projektu ORM a narazil jsem na to, že nevím jak využít pořádně DI. Mám zhruba takovouhle představu:
"":http://www.phpguru.cz/…rstev-modelu nejspodnější vrstu bude tvořit Nette\Database, nad ní pak budou mappery, repository a entity nad kterými budou service a ty budou registrovaný v nette a v presenterech se s nimi bude pracovat. jenomže nevím jak dostat kontext k mapperům. U ORM jde přece o to, oddělit databázi od objektů. A context do mapperu dostanu pouze konstruktorem, takže by to znamenalo že i všechny vyšší vrstvy musí mít v konstruktoru context a předávat ho dál ne? nebo je možnost si kontext sám vytvořit až tam kde je potřeba, tedy v mapperu? tam už by zůstal a nikde jinde v aplikaci by se nepoužil.

David Matějka
Moderator | 6445
+
0
-

ty budes v jednotlivych vrstvach jako zavislost vyzadovat sluzbu vstvy nizsi, takze treba

class ProductDatabaseMapper implements IProductMapper
{
	public function __construct(Nette\Database\Context $database)
}
class ProductRepository
{
	public function __construct(IProductMapper $mapper)
}
class ProductFacade
{
	public function __construct(ProductRepository $repository)
}

vsechno budes mit registrovany jako sluzby v DI kontejneru a ten se postara o sparovani…

Editoval matej21 (26. 8. 2014 23:18)

xbay
Člen | 2
+
0
-

Díky za radu, ale to že každou třídu budu muset registrovat jako službu znamená, že bude z presenteru i přístup třeba k tomu ProductDatabaseMapperu, to přece nechci. Potřebuju aby tyto vrstvy byly neviditelné a přistupovalo se k nim pouze přes ProductFacade.

Jan Endel
Člen | 1016
+
0
-

To je tvůj boj jaký end point svých služeb zaregistruješ do presenteru. To je na programování to krásné, nemůžeš udělat pro službu A službu B viditelnou v DI containeru a pro službu C neviditelnou.