Předávání závislostí v komponentách do hloubky

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

Mám strom komponent, které zajišťují určitou činnost. Základní/kořenová komponenta je obecná, jen vykresluje další komponenty (obálka), resp. nemá žádnou závislost. Až další komponenty mají závislosti. Teď to řeším tak, že závislosti komponent ve stromu tahám skrz konstruktor kořenové komponenty. Přijde mi to však zbytečné. Je možné řešit závislosti uvnitř stromu komponent tak, abych si „nezasíral“ konstruktory kořenových komponent? Díky za odpověd.

F.Vesely
Člen | 369
+
0
-

Zalezi o jake zavislosti jde? Pokud jsou ty zavislosti services, tak to jde. Pokud si ale predavas nejake id, Entitu, datum, tak to musis stale predavat a je to tak i spravne.

emil
Člen | 9
+
0
-

F.Vesely napsal(a):

Zalezi o jake zavislosti jde? Pokud jsou ty zavislosti services, tak to jde.

Jde o tridy modelu. Jak?

Jan Endel
Člen | 1016
+
0
-

na tohle používám kdyby/autowired a hlavně její továrničky – viz docka.

F.Vesely
Člen | 369
+
0
-

Reseni je, ze si nebudes v constructoru rodice predavat zavislosti vsech potomku, ale jen tovarnicky na prime potomky, kteri pak mohou mit dalsi tovarnicky na sve prime potomky, atd.

class ParentControl extends Control
{
	/**
	 * @var IChildControlAFactory
	 */
	protected $childControlAFactory;

	/**
	 * @var IChildControlBFactory
	 */
	protected $childControlBFactory;

    public function __construct(IChildControlAFactory $childControlAFactory,
                                IChildControlBFactory $childControlBFactory)
    {
        parent::__construct();

        $this->childControlAFactory = $childControlAFactory;
        $this->childControlBFactory = $childControlBFactory;
    }

	protected function createComponentChildA()
	{
		return $this->childControlAFactory->create();
	}

	protected function createComponentChildB()
	{
		return $this->childControlBFactory->create();
	}
}
class ChildControlA extends Control
{
	/**
	 * @var Service1
	 */
	protected $service1;

	/**
	 * @var Service2
	 */
	protected $service2;

	...

    public function __construct(Service1 $service1, Service1 $service2, ...)
    {
        parent::__construct();

        $this->service1 = $service1;
        $this->service2 = $service2;
		...
    }
}

interface IChildControlAFactory
{
	/**
     * @return ChildControlA
     */
	public function create();
}
class ChildControlB extends Control
{
	/**
	 * @var Service1
	 */
	protected $service1;

	/**
	 * @var Service2
	 */
	protected $service2;

	...

    public function __construct(Service1 $service1, Service1 $service2, ...)
    {
        parent::__construct();

        $this->service1 = $service1;
        $this->service2 = $service2;
		...
    }
}

interface IChildControlBFactory
{
	/**
     * @return ChildControlB
     */
	public function create();
}
services:
	- App/Controls/IChildControlAFactory
	- App/Controls/IChildControlBFactory
F.Vesely
Člen | 369
+
0
-

Jan Endel napsal(a):

na tohle používám kdyby/autowired a hlavně její továrničky – viz docka.

Kdyby Autowired by se v komponentach pouzivat nemelo. Dokonce myslim, ze to vyhodi vyjimku, pokud neni v Presenteru.

David Matějka
Moderator | 6445
+
+2
-

F.Vesely napsal(a):
Kdyby Autowired by se v komponentach pouzivat nemelo. Dokonce myslim, ze to vyhodi vyjimku, pokud neni v Presenteru.

Nevyhodi, je mozne to tam pouzivat, jen musis zajistit volani te inject metody (treba pomoci decorator extension). Ale ja osobne to tam taky nepouzivam..