„Správný“ Lazy loading služeb

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

Snažím se najít nějaké dobré řešení lazy loadingu při použití DI. Pročetl jsem toto forum, phpFashion a Planette. To, co někdo vyzvedne hned někdo jiný haní. Existuje nějaký „opravdu správný“ přístup?

Tharos
Člen | 1030
+
0
-

Opravdu správný přístup™ není moc smysluplný obrat, protože dost záleží, jaké jsou Tvé požadavky a podle jakých kritérií přístup hodnotíš. :)

To, co asi chceš, by ale měl elegantně řešit návrhový vzor Proxy (tady, tady a tady).

Aby ses neupsal, je žádoucí takového zástupce vytvořit pouze pro služby, u kterých to má smysl.

duke
Člen | 650
+
0
-

Myslím, že @thunderbuff se ptal spíše na lazy loading při použití DI (nejspíše ve vztahu k Nette DI Containeru) než na lazy loading samotný.

V Nette bohužel platí, že jakmile si do konfigu zadefinuješ službu s dalšími závislostmi, tak se při jejím vytvoření vytvoří i všechny její předané závislosti. Tj. automatický lazy-loading poskytovaný Nette DI Containerem je automatický jen v první úrovni (služba se vytvoří, až když si pro ni sáhnu). V podúrovních již nejde o lazy loading (jakmile si pro ni sáhnu, vytvoří se nejen ona, ale i všechny její závislé služby včetně těch, které se nikdy nepoužijí). Tzn. pro ty podúrovně už je třeba řešit autoloading ručně, tzn. nejlépe používat proxy objekty pro služby, jak o tom mluví @Tharos.

Asi je to takto řešené kvůli omezením samotného PHP. Vím, že v některých jiných jazycích jsou nástroje, které toto umožňují řešit lépe. Víc by k tomu asi mohl říct @dg.