Jak zařídit aby systémový kontejner implementoval interface
- mkoubik
- Člen | 728
Zdá se mi, že z něj děláš service locator. DI kontejner je jen jakési
„lepidlo“, které ZVENKU poskládá tvoji aplikaci, produkční kód by
neměl vědět, že něco takového existuje. Do presenterů se kontejner
předává z historických důvodu a protože to některým přijde
pohodlnější.
I když teď mě napadá, že i ten service locator bych implementoval jako
vlastní službu uvnitř kontejneru.
EDIT: tolik teorie, abych se vrátil zpátky na zem: pokud potřebuješ někam předat „krabici“, o které budeš mít jistotu, že umí vyrobit nějakou službu, tak si na to napiš interface + třídu, ale neděď od ní kontejner, jen si ji zaregistruj jako službu a předávej kam potřebuješ. Ale nedělej tu krabici moc univerzální, jinak se z toho zblázníš.
Editoval mkoubik (31. 1. 2013 15:52)
- Filip Procházka
- Moderator | 4668
sharkcz: Přesně tohle jsem čekal. Tohle je špatná cesta, nedělej to prosím.
Zkus se zamyslet nad tím, jak to udělat bez toho a lépe. Klidně můžeš hodit i usecase a my ti poradíme lepší řešení.
- sharkcz
- Člen | 28
Protože třída A pracuje nejenom s třídou B, ale i s C. Samozřejmě, že když pracuje se dvěma cizíma třídama, stále by mohla dostávat přímo instance. Kdyby těch tříd bylo více, pak by ale konstruktor byl samý zbytečný parametr. Obě třídy B a C vystupují pro A jako služby a nemusí být nutně obě použité. Z toho všeho mi vyplývá, že je vhodné předat DI kontejner.
- Filip Procházka
- Moderator | 4668
Z toho všeho mi vyplývá, že když B nebo C nepoužiješ, tak bys měl A rozdělit na A1 a A2 a každá by dostala jen to co potřebuje a to s čím pracuje.
Pokud třída s předanou instancí pracuje, pak parametr v konstruktoru není zbytečný.
Předávat DI Container do modelových tříd je jedna z top prasáren, jakých se můžeš dopustit, hned za statickými modely ;)
- frosty22
- Člen | 373
Poukazuješ na dva problémy, chápu-li to dobře:
- Lazy loading – nechceš předávat přímo instance, když nevíš zda-li budou použité. V tomto zní odpověd accessor – viz https://phpfashion.com/…lazy-loading
- Konstruktor ti příjímá hodně instancí objektů a nevypadá to v kódu dobře, v tomto případě to asi není zrovna správný návrh, když je objekt natolik závislý, že to i v construktoru vypadá špatně :) Ale tohle je tedy hodně subjektivní.