Frage

In der Theorie in Schichtarchitektur können Sie mehrere Module auf der gleichen Ebene haben. Kann diese Module miteinander Querverweis? Ist es möglich, technisch, zum Beispiel. mit .NET?

War es hilfreich?

Lösung

Es ist durchaus möglich, dies zu tun, nur vorsichtig sein, keine zyklischen Abhängigkeiten zwischen den Modulen einzuführen. Im Allgemeinen Module bei einer bestimmten Schicht sollte nur aus der gleichen Schicht auf anderen Modulen abhängen oder von den darunterliegenden Schichten. Die Module sollten nicht von den Schichten über ihnen bewusst sein.

Wenn Sie dies noch strenger machen wollen, dann können Sie auch Abhängigkeiten zu anderen Modulen aus der gleichen oder anderen Schichten begrenzen unmittelbar unterhalb der aktuellen.

Halten Sie die exponierten Schnittstelle auf ein Minimum, z.B. nur einen Kernsatz von öffentlichen Schnittstellen, Wertobjekte aussetzt, und Ausnahmen ist immer eine gute Idee. Sie können die Zugriffssteuerungsfunktionen Sprache verwenden (das heißt private / Paket / public) Sichtbarkeit von Modul Einbauten aus in andere Schichten zu verschütten zu begrenzen.

Andere Tipps

Technisch können Sie Querverweise in jede Richtung Sie in .NET wollen (es gibt keine technischen Einschränkungen für eine DAL eine UI-Komponente zu verweisen, auch wenn es nicht eine gute Idee sein kann). Ich sehe keine Probleme mit Modulen innerhalb der gleichen Schicht verweisen.

Aber wir müssen auf dem Wort „Schicht“ ein bisschen sehen, da sie Schichten in verschiedenen Formen und Größen. Oft, wenn wir das Wort „Schicht“ verwenden wir denken Data Access Layer oder Presentation Layer, und wir in der Regel erlauben Schichten schauen nach unten, aber nicht upwars.

Innerhalb jeder Schicht, die verschiedenen Module oft auch lassen sich in Schichten angeordnet sein, logisch. Die gleiche Regel gilt auch hier; ein Modul nach unten schauen, aber nicht auf. Mit dem im Verstand es es ziemlich sicher fühlt Module innerhalb derselben (äußere) Schicht zu verweisen.

Haben einfach nicht zwei Module aufeinander verweisen, direkt oder indirekt. Wenn Sie, dass A finden und B müssen beide Funktionen voneinander (was anzeigt, dass A und B auf dem gleichen Niveau sind), werden Sie wahrscheinlich den Code Refactoring benötigen, vielleicht ein neues Modul C Einführung logisch unter A platziert und B, die sowohl von ihnen können verwendet werden.

Beachten Sie auch, um die Module zu halten wie möglich abgelöst; je weniger sie wissen umeinander, desto besser.

als Pavel sagte, seien Sie vorsichtig mit Ihren zyklischen Abhängigkeiten. Wenn Sie absolut nicht ohne eine zyklische Abhängigkeit leben können (was Sie Querverweis nennen), müssen die Klassen sein, nicht nur aus der gleichen ‚Schicht‘, sondern auch die gleichen Anordnung.

Dass gesagt wird, sollte es keinen Grund für Querverweise sein -. Sollte nicht nur (wie pavel sagte) Module hängen nur von den Schichten darunter, dass Einwegabhängigkeit in allen Fällen existieren sollten

Es gibt einige logische Ausnahmen von dieser Regel, beispielsweise in so etwas wie ein Domain-Modell - ein Kunde mehrere Aufträge haben, sagen. Es könnte in diesem Fall (insbesondere mit ORMs etc.), um eine Liste der Aufträge auf den Kunden und einen Verweis auf den Kunden von jeder Bestellung nützlich sein. In Bezug auf den Einheiten von Funktionen wie Dienste usw., sollte es nur eine Möglichkeit, Abhängigkeiten sein.

Ein Weg, um dieses Problem zu bekommen, ist Inversion of Control durch Windsor zu verwenden, Autofac, spring.net etc. Sie können eine Schnittstelle in einer Baugruppe und ein anderes Objekt definieren, die eine konkrete Umsetzung dieser Schnittstelle verbraucht. Eine andere Bibliothek kann die tatsächliche Implementierung enthalten (was bedeutet, dass die Montage muss die erste Assembly verweisen). In diesem Fall greifen die IoC-Container die Umsetzung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top