DI inject – problém závislostí s děděnými třídami

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

Zdravím,

mám problém s injektováním závislosti, která je ve vztahu IS-A k nějaké jiné závislosti.

Mám v configu:

imageFacade: MTS\App\Models\Facades\ImageFacade
adImageFacade: MTS\App\FrontModule\AdModule\Models\Facades\AdImageFacade

Problém je, že pokud v presenteru mám kód uvedený níže, tak dostanu chybu Multiple services of type MTS\App\Models\Facades\ImageFacade found.

Dá se to nějak obejít? Nechci aby mi prošel potomek, když chci předka.

	/** @var \MTS\App\Models\Facades\ImageFacade ImageFacade */
	private $imageFacade;

	/**
	 * Method to inject a dependency.
	 *
	 * @param \MTS\App\Models\Facades\ImageFacade $imageFacade
	 *
	 * @throws InvalidStateException
	 * @return void
	 */
	public function injectImageFacade(\MTS\App\Models\Facades\ImageFacade $imageFacade)
	{
		try {
			if ($this->imageFacade !== NULL)
				throw new InvalidStateException('ImageFacade has already been set.');

			$this->imageFacade = $imageFacade;
		} catch (\Exception $e) {
			$this->processException($e);
		}
	}
Felix
Nette Core | 1189
+
0
-

S dedenim IMHO problem neni. Nemas spatne type hint?

darthcz
Člen | 113
+
0
-

Nene, mám to přesně dle toho, jak jsem to tu sem dal. AdImageFacade je potomek ImageFacade. Pokud z konfigurace umažu jednu z tříd (je jedno kterou), tak to injectne tu druhou v pohodě, ale jak jsou tam obě, je to problém.

Jan Endel
Člen | 1016
+
0
-

S děděním problém v tomhle případě je, ale řešení je jednoduché, u konkrétně předávání těchto tříd je nepředávat autowiringem ale pěkně růčo, aby compiler poznal, jakou třídu tam má hodit.

enumag
Člen | 2118
+
0
-

Máš-li více služeb stejného typu, musíš u všech kromě nejvýše jedné vypnout autowiring:

imageFacade: MTS\App\Models\Facades\ImageFacade
adImageFacade:
	class: MTS\App\FrontModule\AdModule\Models\Facades\AdImageFacade
	autowired: false
darthcz
Člen | 113
+
0
-

Díky za odpovědi. Nakonec jsem z předka udělal abstraktní třídu a injectuju pouze koncové třídy, což mě ušetřilo problémů :)

enumag
Člen | 2118
+
0
-

@darthcz: Velmi rozumné řešení. :-) Někde jsem slyšel „pravidlo“ že všechny třídy v OOP by měly být abstract nebo final.