2010-04-09 30 views
10

Beispiel zirkuläre Abhängigkeiten zu lösen. Also muss ich den Konstruktor zu etwas Refactoring wie:Dependency-Injection

void MyClass(Composition composition) 
{ 
    m_Composition = composition; 
} 

Jedoch habe ich ein Problem bekommen, da die Composition -Objekt auf dem Objekt vom Typ beruht MyClass, die gerade erstellt wird.

Kann ein Abhängigkeits-Container dies beheben? Soll das so sein?
Oder ist es nur schlechtes Design von Anfang an?

Antwort

11

Nr, ein DI Container wird keine zirkuläre Abhängigkeit lösen - in der Tat wird es dagegen protestieren, indem sie Ausnahmen werfen, wenn Sie versuchen, die Abhängigkeiten zu lösen.

In vielen DI-Containern können Sie eine erweiterte Konfiguration bereitstellen, mit der Sie dieses Problem lösen können, aber selbst keine zirkulären Abhängigkeiten auflösen können. Wie konnten sie?

Als Faustregel gilt, eine kreisförmige Abhängigkeit ist ein Design Geruch. Wenn Sie können, denken Sie über ein alternatives Design nach, bei dem Sie die zirkuläre Abhängigkeit loswerden - das gibt Ihnen auch weniger Kopplung. Einige mögliche Alternativen Redesign:

  • Verwenden Ereignisse von einer Klasse zur anderen zu signalisieren. Oft geht eine zirkuläre Abhängigkeit bereits meistens in eine Richtung, und wenn dies der Fall ist, kann ein Teil dieser Signalisierungs-API als Ereignisse den Kreis schneiden.
  • Wenn das Obige wahr ist, aber Sie das Gefühl haben, dass Ereignisse falsch scheinen, können Sie das Observer Muster anwenden.
  • Wenn die Kommunikation wirklich in beide Richtungen gehen muss, können Sie eine Mediator verwenden, über die die Komponenten kommunizieren können.

aber ich wählte mit Absicht das Wort Geruch über anti-Muster, da Eckfällen ist (vor allem, wenn Sie mit extern definierten APIs beschäftigen), wo zirkuläre Abhängigkeiten nicht vermieden werden können.

In solchen Fällen müssen Sie entscheiden, wo die Abhängigkeitserzeugung leicht zu lösen ist. Sobald Sie das wissen, kann die Injektion einer Abstract Factory hilfreich sein, um eine der Kreationen zu verschieben, bis die anderen Teile des Kreises erstellt wurden.

Diese other answer ist das beste, verfügbare Beispiel von denen ich derzeit bewusst bin, aber wenn ich so fett sein kann, wird mein kommendes Buch auch einen Abschnitt enthalten, der genau dieses Problem anspricht.

+0

Danke für die Antwort. Ich werde versuchen herauszufinden, ob ich den Zirkelverweis in meinem Fall vermeiden kann, obwohl ich mir noch nicht sicher bin: Ich brauche die Referenz, um einige Ereignisse von MyClass in Compositions Konstruktor zu abonnieren ... Danke, dass du dein Buch erwähnt hast klingt sehr interessant. Ich freue mich darauf, es zu lesen. – tanascius

+0

Zur Klarstellung: Obwohl Sie schon früh Zugang zu dem Buch kaufen können, ist der Abschnitt über den Umgang mit Zirkelbezügen noch nicht verfügbar. –

Verwandte Themen