Předávání závislostí v komponentách do hloubky
- emil
- Člen | 9
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
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
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
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..