Dvě services v configu, jedna je potomkem druhé

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

Zdravím,
existuje nějaké řešení pro situaci, kdy mám v configu zaregistrované dvě služby, kde jedna je potomkem druhé?

Máme v rámci týmu nějaké vlastní knihovny, které si taháme přes composer. Jedna z nich si v configu (svém vlastním) registruje službu pro práci s uživateli, dejme tomu TeamLib\UserService. Protože ale ve své aplikaci potřebuju UserService rozšířit, tak mám ještě vlastní App\UserService, která je potomkem zmíněné TeamLib\UserService.

Při generování DI containeru dostanu následující chybu:

Nette\DI\ServiceCreationException
Multiple services of type TeamLib\UserService found: teamLib.userService, 150_App_UserService

Dá se to nějak rozumně řešit? Pojmenovávat službu se mi nechce, pokud to nebude nutné. Zasahovat do knihovny, to je otázka, zatím jsme s ní na začátku, takže by to ještě šlo, zvlášť pokud je to koncepčně blbě a povede to k problémům. Za jakékoliv konstruktivní nápady budu ráda.

Editoval chikeet (6. 10. 2015 16:28)

David Matějka
Moderator | 6445
+
+1
-

Bez pojmenovanych sluzeb to asi nijak (snadno) vyresit nepujde.

U knihoven je prave z takovyhle duvodu lepsi sluzby pojmenovavat a anonymni sluzby pouzivat pouze v aplikaci.

Pavel Kravčík
Člen | 1180
+
+2
-

Řešil jsem to abstraktním předkem, který není registrovaný. Tj. mají společnou funkčnost, ale vytváří se každá zvlášť. A pak existují 2 služby PSAKlientModel a KlientModel. DRY to asi je. Jestli je to hezké to nevím, ale je to funkční a nepřijde mi to jako prasárna. I když KlientModel je vlastně prázdný.

Jan Endel
Člen | 1016
+
0
-

Případně někdy se hodí mít i něco jako Resolver, který člověk nějak nakonfí a přes setup v neonu přidá dvě třídy a na základě vnizřní rozhodovací logiky jeho metoda vrátí první nebo druhou třídu. Ale nemyslím si, že pro tenhle konkrétní use case je to dobrá cesta.

Tomáš Votruba
Moderator | 1114
+
0
-

Záleží na architektuře tvého use case. Můžeš také extrahovat interface a použít jednu třídu jako fasádu a druhou do ní předat.

Hodil by se zdroják s metodami, např. hodit na Gist.

chikeet
Člen | 160
+
+1
-

Nakonec se ukázalo, že už to máme vlastně vyřešeno tím pojmenováváním služeb v knihovnách, problém byl mezi mou klávesnicí a židlí :-) Díky všem za odpovědi.