Dokumentace – Inject autowire
- ViPEr*CZ*
- Člen | 817
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.
- David Ďurika
- Člen | 328
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
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
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
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
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 | 817
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
@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 | 817
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