Ich habe mehrere Artikel auf verschiedenen Websites gesehen, die vorschlagen, zirkuläre Abhängigkeiten zwischen .NET-Assemblys mithilfe der Abhängigkeitsinjektion aufzulösen. Dies kann die Build-Fehler beheben, aber es löst nicht wirklich die zirkuläre Abhängigkeit, oder? Für mich scheint es immer noch einen logischen Fehler in der Architektur zu geben. Bin ich verrückt oder stimmen andere zu 1) Dies ist eine weniger als stellare Verwendung von DI, und 2) nicht der geeignete Weg, zirkuläre Abhängigkeitsprobleme zu lösen?Auflösen von zirkulären Abhängigkeiten mit Abhängigkeitsinjektion
Antwort
DI ist nicht für die Auflösung von zirkulären Abhängigkeiten gedacht, sondern um die Erzeugung von gut entkoppelten und damit testbaren Komponenten zu erleichtern.
Wenn Sie zirkuläre Abhängigkeiten zwischen zwei Objekten haben, bedeutet das, dass Sie ein drittes Objekt benötigen, von dem die beiden Objekte abhängen, damit sie nicht voneinander abhängen. Hier ist ein Artikel, der die genaue Lösung für Ihr Problem ist:
http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/
+1 Großer Link - dieser Artikel erklärt es wirklich gut! – Ergwun
- Ja, Sie machen es noch schwieriger, sie zu erfassen, indem eine zusätzliche Abstraktionsschicht verwendet wird.
- Sie lösen die zirkuläre Abhängigkeit nicht, sondern verstecken sie, indem Sie eine zusätzliche Ebene der Abstraktion hinzufügen, indem Sie die späte Begrenzung verwenden oder/und sie lose koppeln.
Die gleiche Antwort kehrt in den folgenden Beiträge (was ich für Verweise hinzufügen wird), die eine 3. Klasse beide davon abhängen, welche schaffen. Dies bedeutet: Sie sind und verletzen das Prinzip der einheitlichen Verantwortlichkeit. Durch Verschieben (Extrahieren) der Verantwortung, auf die beide Klassen in einer separaten Klasse angewiesen sind, entfernen Sie die zirkuläre Abhängigkeit.
FYI die Single Responsibility Pattern on Wikipedia
Stackoverflow Diskussionen von anderen:
- business-logic-layer-and-data-access-layer-circular-dependency
- are-circular-class-dependencies-bad-from-a-coding-style-point-of-view
My answer auf Stackoverflow mit einem Beispiel für die Verantwortung in einer separaten Klasse zu extrahieren.
Ich werde in meinem $ 0.02 hier werfen, da ich bei der Suche nach „Entfernen von zyklischen Abhängigkeiten“
Ja dies hilfreich Beitrag gefunden. Sie können DI verwenden, um zirkuläre Abhängigkeiten aufzulösen. Der erste Schritt zur Behebung eines Problems besteht darin, es zu finden. Ninject beschwerte sich über meine zirkuläre Abhängigkeit und warf beim Bootstrapping eine hilfreiche Ausnahme auf. Ninject hat es für mich gefunden und zwingt mich, es zu reparieren. Ich könnte betrügen und die Injektion von Eigentum oder die Injektion von Methoden verwenden, aber das bricht meinen Schutz der Klasseninvarianten (worüber ich denke, worüber Sie sich beschweren).
Also eine Stimme für Ctor Injektion über IoC, weil es kreisförmige Abhängigkeiten für Sie erkennen. Es liegt dann an Ihnen, den Architekturfehler zu überarbeiten und zu entfernen.
Obwohl im Allgemeinen ein Redesign soll, hier geschehen ist eine Referenz: http://stackoverflow.com/questions/1316518/how-did-microsoft-create-assemblies-that-have-circular-references/1316558# 1316558 – Dykam