DI v presenteri nieje lazy?
- Čamo
- Člen | 798
Prosím vás prečo sa mi spúšta conštruktor modelu, keď sa cez
@inject deklaruje v BasePresentery? Ja som si vždy myslel že je to
lazy. Aj podľa dokumentácie som to tak pochopil.
the individual services are created only on demand (lazy loading)…
Ten patern s BasePresenterom som zdedil a asi je to bad practice ak to chápem
správne.
Čiže @inject asi automaticky konštruktor zavolá a malo by sa teda
injektovať iba do presenterov ktoré danú závislosŤ potrebujú?
- nightfish
- Člen | 519
Čamo napsal(a):
the individual services are created only on demand (lazy loading)…
Pravděpodobně ve smyslu, že se neinstanciují vždy, ale jen když si je
vyžádá jiná služba/presenter atd.
U presenteru se v okamžiku jeho vytvoření vytvářejí i všechny jeho
závislosti, nezávisle na tom, jestli jsou přes konstruktor, atribut
#[Inject]
, anotaci @inject
nebo inject*()
metodu.
Pokud chceš lazy-load i v takovém případě, tak si hádám můžeš pomoct accessorem.
- m.brecher
- Generous Backer | 873
@DavidGrudl
Souhlasím, je to teoretický článek o principu DI a v kontextu toho článku je to OK. Problém ale může nováčkovi dělat to, že si tu větu míněnou v tom teoretickém kontextu „the individual services are created only on demand (lazy loading)“ zobecní tak, že se konstruktor služeb Nette volá až když se služba použije – tj. i když službu předáme autowire do presenteru, služba se vytvoří lazy, tj. např. komponenta až při vykreslování.
100% souhlasím s formulací „the individual services are created only on demand“.
Formulace „lazy loading“ může způsobit nesprávné pochopení. V Nette skutečný lazy loading zajistí accessor.
Proto navrhuji větu „the individual services are created only on demand (lazy loading)“ změnit na „the individual services are created only on demand“, smysl článku to nezmění a předejde se nesprávnému pochopení.
Jestli souhlasíš, můžu napsat PR.