Accessor – reálné použití?

Klobás
Člen | 113
+
0
-

Ahoj,

nerozumím moc accessorům https://doc.nette.org/…tion/factory#…
Služby si předávám klasicky přes DI (díky DI se službě případně doplní další závislosti).

K čemu mi bude accessor, který si injectnu, pak si přes get metodu vratím službu. V čem je výhoda proti klasickému injectu?

Navíc se v dokumentaci píše:
Rozhraní musí mít přesně jednu metodu s názvem get a deklarovat návratový typ:

A o pár odstavců níže:
Lze ale velmi snadno vytvořit i vícenásobné továrny kombinované s accessory. Rozhraní takové třídy bude obsahovat libovolný počet metod s názvy create<name>() a get<name>(), např.:

Takže není tedy pravidlo, že accessor musí mít přesně jednu get metodu. Může tedy obsahovat více služeb?

A když si vezmu tuto ukázku.

CreateFoo – vrátí službu
getDb – vrátí ale taky službu ne?

interface MultiFactory
{
	function createArticle(): Article;
	function createFoo(): Model\Foo;
	function getDb(): PDO;
}

K čemu jsou accessory? Kdybych chtěl používat víc služeb z jednoho zdroje, tak si udělám fasádu se závislostí na jiné služby a pak v rámci fasády ony služby volám.

Som z toho zmatený jak včelka mája :-)

Marek Bartoš
Nette Blogger | 1177
+
+4
-

create vytvoří a vrátí pokaždé novou instanci třídy (nikoli služby)
get vrací pokaždé stejnou instanci služby, nevytváří ji

Accessor slouží k lazy-loadingu. Inicializace některých služeb může trvat a pokud nevíš jistě, zda je během requestu využiješ, tak by se inicializovaly zbytečně.

Editoval Marek Bartoš (31. 3. 2023 11:58)

dakur
Člen | 493
+
+1
-

Já jsem je začal potřebovat kvůli tomu, že naše infrastruktura ještě nebyla asynchronní i když kód na to byl ready. Takže zjednodušeně např. facade nepočítala s tím, že by byla volána zevnitř modelu (přes listenery) a vznikla tam kruhová závislost.

Myslím, že se docela těžko chápe, k čemu to je, dokud to nepotřebuješ. A skoro mi přijde, že je to potřeba často jako work-around na nějaké problémy s návrhem částí aplikace. I to, co zmínil Marek mi přijde, že by bylo lepší řešit tím nemít logiku v constructoru a použitím factories/builderů. Ale třeba se pletu. 🙂

Editoval dakur (31. 3. 2023 12:03)

Klobás
Člen | 113
+
0
-

Marek Bartoš napsal(a):

create vytvoří a vrátí pokaždé novou instanci třídy (nikoli služby)
get vrací pokaždé stejnou instanci služby, nevytváří ji

Accessor slouží k lazy-loadingu. Inicializace některých služeb může trvat a pokud nevíš jistě, zda je během requestu využiješ, tak by se inicializovaly zbytečně.

Super, tak ted mi to je už jasné.

Klobás
Člen | 113
+
0
-

dakur napsal(a):

Já jsem je začal potřebovat kvůli tomu, že naše infrastruktura ještě nebyla asynchronní i když kód na to byl ready. Takže zjednodušeně např. facade nepočítala s tím, že by byla volána zevnitř modelu (přes listenery) a vznikla tam kruhová závislost.

Myslím, že se docela těžko chápe, k čemu to je, dokud to nepotřebuješ. A skoro mi přijde, že je to potřeba často jako work-around na nějaké problémy s návrhem částí aplikace. I to, co zmínil Marek mi přijde, že by bylo lepší řešit tím nemít logiku v constructoru a použitím factories/builderů. Ale třeba se pletu. 🙂

Je mi to jasnější :) zatím zůstanu klasického injectu/autowiringu a Fasád (pokud budu potřebat víc věcí v jednom) a třeba nastane případ, že to budu potřebovat a vzpomenu si na tenhle thread.

Díky oboum, za trpělivost vysvětlovat méně chápavejším :)

m.brecher
Generous Backer | 763
+
-1
-

@Klobás

Je mi to jasnější :) zatím zůstanu klasického injectu/autowiringu a Fasád

Ano, já také – k databázi se v běžné aplikaci připojujeme v podstatě vždycky a accessor úsporu nepřináší. Ale jak se v dokumentaci k Accessoru uvádí ten příklad atypického zápisu občasných chyb do jiné databáze než ze které se generují stránky, tak tam dává smysl se k této druhé databázi nepřipojovat automaticky, ale až při zápisu dat. Takže někdy se accessor hodit může.

Klobás
Člen | 113
+
0
-

m.brecher napsal(a):

@Klobás

Je mi to jasnější :) zatím zůstanu klasického injectu/autowiringu a Fasád

Ano, já také – k databázi se v běžné aplikaci připojujeme v podstatě vždycky a accessor úsporu nepřináší. Ale jak se v dokumentaci k Accessoru uvádí ten příklad atypického zápisu občasných chyb do jiné databáze než ze které se generují stránky, tak tam dává smysl se k této druhé databázi nepřipojovat automaticky, ale až při zápisu dat. Takže někdy se accessor hodit může.

Mám to podobně, asi to člověk ještě nepotřeboval, snad si vzpomenu, až budu.