Circular reference detected for services

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

Zdravim.
Vytvářím hru ve které za každé přihlášení dostane uživatel 10 bodů.

Připisovnání bodů jsem si vytvořil CreditFactory, která připíše uživateli body (časem v této třídě bude připisovaní bodů za souboje, objevení nového území, … prostě vše co souvisí s bodama).

Když se uživatel přihlásí, podívám se zda se dnes přihlásil poprvné (to dělám v modelu UserManager)
Pokud se přihlásil poprvé zavolám továrnu CreditFactory kde mám metodu pro připsání bodů za přihlášení.

Problém je v tom, že v CreditFactory používám model UserManager a laděnka mi končí chybou:
Circular reference detected for services

Jak na to? Nebo co dělám špatně?

Šaman
Člen | 2666
+
0
-

No, asi děláš něco špatně. Zkus si vypsat, co která třída dělá (tady asi především CreditFactory a UserManager) a jestli by se nedala rozdělit na víc tříd. Potřebuje UserManager skutečně CreditFactory, nebo jen nějaká data, která mu může předat třeba presenter? Ideální je mít co nejméně přímých závislostí. V případě, že dvě třídy spolu musí blízce komunikovat, se dá vytvořit obalující třída, která obsahuje (závisí na) obě problematické třídy a v ní je ten kód, pro který jsou obě závislosti potřeba (takže jestli jí UserManager řekne, že se jedná o první přihlášení, je to ona kdo zaúkoluje CreditFactory aby připsala správný počet bodů).

rixi
Člen | 109
+
0
-

v tomto pripade mi pomohlo pouzitie metody inject() namiesto injektovania v constructoru. podpora inject() mimo presenteroch je az vo verzii 2.1-dev.