Dokumentace – Inject autowire

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

Našel jsem chybu v tomto článku?
https://pla.nette.org/…ect-autowire#…
Ve větě: „Autowire je automatizace a žádná automatizace není zcela dokonalá. I autowiring pomocí inject metod své mouchy.“
chybí slovo má (má své mouchy).
Btw. jak to je s injectem? Když injectuju službu v presenteru, tak se instance služby vytvoří pokaždé, i když jí nepoužiju? Nebo jsem jen někde něco udělal špatně? Mám totiž presenter, kde injectuju službu registrovanou v configu, ale ta se použije jen při určité akci. Když jsem ale na jiné render metodě a zkusil jsem si dát do konstruktoru služby špatný parametry připojení k imap serveru, tak i když službu nepoužiju dostanu warning z konstruktoru služby. Nemají být services lazy loading?
Pro úplnost to je na 2.0.8 verzi pro PHP 5.3.

vvoody
Člen | 910
+
0
-

Ano, vždy sa injectnu všetky, riešenie vytvoril @HosipLan

enumag
Člen | 2118
+
0
-

Obecně Dependency Injection a Lazy Loading jdou přímo proti sobě. Nebo aspoň tak sem to pochopil.

David Ďurika
Člen | 328
+
0
-

enumag napsal(a):

Obecně Dependency Injection a Lazy Loading jdou přímo proti sobě. Nebo aspoň tak sem to pochopil.

ani nie.. na to je predsa Factory a Accessor

Patrik Votoček
Člen | 2221
+
0
-

ViPErCZ napsal(a):


Ve větě: „Autowire je automatizace a žádná automatizace není zcela dokonalá. I autowiring pomocí inject metod své mouchy.“

fixed! díky!

bene
Člen | 82
+
0
-

enumag napsal(a):

Obecně Dependency Injection a Lazy Loading jdou přímo proti sobě. Nebo aspoň tak sem to pochopil.

Pokud by jsi programoval zásadně proti Interfaces, což až na rozumné vyjímky by jsi měl (když už řešíš Dependency Injection, tak proč nepoužívat další dobrá pravidla ojektového návrhu), tak prostě použiješ Proxy třídu a máš Lazy Loading vyrešený a pořád se držíš pravidla DI.

Nicméně uznávám, že programovat vše proti Interfaces je docela otravné…

Editoval bene (18. 1. 2013 9:45)

Honza Marek
Člen | 1664
+
0
-

ViPErCZ napsal(a):
Mám totiž presenter, kde injectuju službu registrovanou v configu, ale ta se použije jen při určité akci.

Jedna možnost je dělat menší presentery, klidně s jednou akcí.

zkusil jsem si dát do konstruktoru služby špatný parametry připojení k imap serveru, tak i když službu nepoužiju dostanu warning z konstruktoru služby.

Zásadní chyba je, že konstruktor dělá takové náročné věci jako je připojování se k imap serveru. Konstruktor by měl pouze zvalidovat parametry a přiřadit je do privátních proměnných objektu. Pokud se toho programátor drží, lazy loading není vlastně vůbec potřebný.

enumag
Člen | 2118
+
0
-

Honza Marek napsal(a):
Zásadní chyba je, že konstruktor dělá takové náročné věci jako je připojování se k imap serveru. Konstruktor by měl pouze zvalidovat parametry a přiřadit je do privátních proměnných objektu. Pokud se toho programátor drží, lazy loading není vlastně vůbec potřebný.

Přesně to jsem měl na mysli. Jakékoli Accessory (@achtan) a Proxy třídy (@bene) místo jednoho objektu pouze vytvářejí jiný objekt, se kterém se navíc mírně hůře pracuje. Problém je, že tohoto pravidla se nedrží ani Nette.

@achtan: Kromě toho pro Accessory neni narozdíl od Factories přímá podpora v config.neon takže je poměrně otravné je psát a používat.

ViPEr*CZ*
Člen | 792
+
0
-

Honza Marek napsal(a):
Zásadní chyba je, že konstruktor dělá takové náročné věci jako je připojování se k imap serveru. Konstruktor by měl pouze zvalidovat parametry a přiřadit je do privátních proměnných objektu. Pokud se toho programátor drží, lazy loading není vlastně vůbec potřebný.

Tak to jsem si asi stáhl blbou třídu z phpclasses.org :-D
Je pravda, že to mě nenapadlo a že by vytvoření objektu vyplnilo jen properties bylo celkem nenáročné na rychlost… ale furt se vytváří v paměti objekt a pro určité části presenteru není potřeba. Myslel jsem právě, že Nette tím, že si to registruje člověk přes config, obsará za mě lazzy loading. To už bych nic nezkazil i tím, kdybych si zavolal přes new vytvoření objektu až v té dané metodě Presenteru, jestli se nepletu :-)

Filip Procházka
Moderator | 4668
+
0
-

@ViPEr*CZ*: Nezkazil. Ale musíš si uvědomit, že do toho objektu nějak potřebuješ dostat závislosti (pokud nějaké vyžaduje). V takovém případě, je nejlepší prohnat to přes DI Container.

ViPEr*CZ*
Člen | 792
+
0
-

Filip Procházka napsal(a):

@ViPEr*CZ*: Nezkazil. Ale musíš si uvědomit, že do toho objektu nějak potřebuješ dostat závislosti (pokud nějaké vyžaduje). V takovém případě, je nejlepší prohnat to přes DI Container.

Jasně to je další problém… pokud bude objekt mít ještě například připojení k databázi, pak se to zkomplikuje a pak už se vyplatí z důvodu lenosti autowire v configu.
Tím pádem jesli se nepletu, tak mi kámoš inject* spustí i připojení k oné DB? A když to budu chtít mít podle toho co napsal Honza a zároveň bych nechtěl mít něco jako metodu imap->connect(), kterou budu volat až někde v průběhu, tak abych si ještě do objektu zakomponoval vlastní lazy na připojení k imapu :-( Uff to je práce :-D