Jak zařídit aby systémový kontejner implementoval interface

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

Jak byste řešili, aby systémový kontejner implementoval několik specifických rozhranní? Já to nyní řeším tak, že dědí z třídy, která daná rozhraní implementuje. Rád bych ale vlastní třídu vynechal.

Filip Procházka
Moderator | 4668
+
0
-

A na co to potřebuješ?

sharkcz
Člen | 28
+
0
-

Abych mel jistotu ze DI kontejner implementuje konkretni metody. Napriklad getCurlService. Kdyz ted nad tim premyslim, tak se stejne bez vlastni tridy neobejdu, nebot systemovy kontejner ma jen metodu getService.

mkoubik
Člen | 728
+
0
-

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
+
0
-

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
+
0
-

Me ten muj pozadavek prijde rozumny. Zkuste mi vyvratit muj nazor.

Mam tridu A, u ktere vim, ze pouziva tridu B. V konstruktoru tedy ocekavam objekt, ktery ma metodu getB. Mam tedy specifikovane rozhranni s metodou getB a toto rozhranni ocekava konstruktor.

Jan Tvrdík
Nette guru | 2595
+
0
-

@sharkcz: A proč třída A neočekává v konstruktoru instanci B?

sharkcz
Člen | 28
+
0
-

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
+
0
-

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
+
0
-

Poukazuješ na dva problémy, chápu-li to dobře:

  1. 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
  2. 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í.