Accessor – reálné použití?
- Klobás
- Člen | 113
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 | 1280
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
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
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áří jiAccessor 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
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 | 873
@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
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.