2010-01-12 13 views
20

Ich habe 2 Projekte.Circular Abhängigkeiten

Projekt # 2 hat einen Verweis auf Projekt # 1

Jetzt muss ich Projekt # 2 in Project # 1, verweisen aber vs.net um eine zirkuläre Abhängigkeit beschwert.

Gibt es einen Ausweg?

+2

Zumindest sind wir uns alle auf unsere Antwort einig .. ;-). +1 an alle – David

Antwort

52

Absolut nicht. Kreisförmige Abhängigkeiten sind ein Anzeichen für schlechtes Design. Ich will nicht hart sein. Es gibt einige Möglichkeiten, dies zu erreichen.

1) Sie können zu einem anderen Projekt gemeinsamen Code Refactoring, sagt Projekt # 0

2) Sie Ihr Design beheben kann, was wahrscheinlich der Weg zu gehen.

Onkel Bob hat einen guten Artikel über Verpackungsprinzipien, der das Prinzip der azyklischen Abhängigkeiten beinhaltet. http://www.objectmentor.com/resources/articles/granularity.pdf. Lesen Sie dies, um zu erfahren, warum zyklische Abhängigkeiten eine schlechte Sache sind.

+1

Eine häufige Lösung besteht darin, auf Abstraktionen wie Interfaces statt auf konkrete Instanzen zu setzen und diese Abstraktionen auf eine andere Assembly zu verschieben. Denken Sie aber wirklich an Ihre Projektstruktur und was wirklich wo hingehört. – kyoryu

+0

+1 für verknüpften Artikel. Ich habe mein "Logger" -Paket aufgeteilt, das ein "Anwendungsverwendungsprotokoll" -Satz von Klassen und eine "Fehlerprotokollierungs" -Klasse in zwei separate Pakete umfasste (die meisten Pakete müssen die Anwendungsverwendung nicht protokollieren!), Dann verknüpfte das WAS Rundschreiben zurück zum Original. Zurück zu einer DAG. Sollte für alle lesbar sein. – DFTR

+0

@kyoryu Sie sprechen über das Dependency Inversion Principle (DIP), das er in dem Artikel erwähnt? - Ich stimme zu, Sie sollten wahrscheinlich versuchen zu finden, warum das Potenzial für zirkuläre Abhängigkeit besteht, und vielleicht Elemente des Designs ändern (wenn Sie können), bevor sie auf Abstraktionen angewiesen sind. – DFTR

5

Mischen Sie die beiden zu einem oder Redesign.

4

Nein. Strukturieren Sie Ihre Projekte richtig. Versuchen Sie, eine Art von Ordnung basierend auf Abstraktion zu verwenden - von niedrig bis hoch.

5

Dies deutet auf ein Problem in Ihrem Design hin. Wenn zwei oder mehrere Ihrer Typen sich gegenseitig bewusst sein müssen, sollten sie in derselben Baugruppe vorhanden sein.

+0

Und wenn sie in verschiedenen Sprachen sein müssen? – Joshua

+0

Können Sie ein Beispiel geben? –

+0

[Veraltetes Beispiel:] In VS 2008 kann nur VB .NET Ausnahmefilter verwenden, während nur C# Linq-Ausdrücke verwenden kann. Es ist nicht schwer, sich einen Fall vorzustellen, in dem diese in sich widersprechenden Konfigurationen auftreten. – Joshua

10

Refaktorieren Sie Ihre Projekte, um die gemeinsamen Elemente in ein "Projekt # 0" zu zerlegen, auf das sich sowohl Projekt # 1 als auch Projekt # 2 beziehen.

2

I wirklich bedeuten nicht, einen Smart-aleck sein, aber besser Programm-Design ist die Antwort.

3

Eine zirkuläre Abhängigkeit bedeutet, dass es sich nicht mehr um zwei unabhängige Projekte handelt (da es unmöglich ist, nur eine davon zu erstellen).

Sie müssen entweder umgestalten, so dass Sie nur eine einseitige Abhängigkeit haben, oder Sie sollten sie in ein einzelnes Projekt zusammenführen.

3

Rundreferenz kann erfolgen, wie in einem previous question gesehen, aber man sollte es nicht tun für die Gründe jeder schon hier angegeben.

1

Dies scheint ein Designfehler zu sein, sonst nichts. Re-Design ist die Lösung.

-4

Ich glaube nicht, es ist eine gute Lösung, aber immer noch können wir auf Debug-Ordner von DLL-Projekt mit dem folgenden Schritten

  • hinzufügen, um die Referenz
  • Durchsuchen und
  • gehen zu tun,
  • finden Sie die .dll und Hinzufügen.
+2

tu das nicht! Folgen Sie dem, was in der angenommenen Antwort angegeben ist! –