Die Hexagonale Architektur - Hexagonal-, Onion- & Clean-Architecture Vergleich, Teil 3

Von: Thomas Bayer
Datum: 8. Juli 2024

Diese Einleitung führt leicht verständlich in die Softwarearchitekturen Hexagonal-, Onion- und Clean-Architecture ein.

In diesem Teil wird die hexagonale Architektur mit ihren charakteristischen Diagrammen beschrieben.



3. Die Hexagonale Architektur

Eine beliebte Architektur, die Dependency Inversion verwendet, ist die Hexagonale Architektur.


Abbildung : Das Hexagon

Die Architektur hat ihren Namen vom Sechseck, das für die Darstellung verwendet wird. Beschrieben wurde sie 2005 von Alistair Cockburn. Ziel war es, die Domain, also die Fachlichkeit, von den technischen Details zu trennen.

Die Applikation steht für die Fachlichkeit, die im Innern des Sechsecks dargestellt wird. Sie umfasst die Geschäftslogik, die über Ports von der Technik geschützt bzw. entkoppelt wird. Die Geschäftslogik stellt einen großen Wert für das Unternehmen dar und ändert sich in der Regel weniger oft als die Technik z.B. das verwendete Web- oder Persistenz Framework.

Externe Infrastruktur wird mit der Applikation über Ports und Adapter verbunden. Auf der linken Seite werden Systeme dargestellt, die aktiv auf die Anwendung zugreifen. Auf die rechte Seite kommen Systeme, die die Anwendung aufruft.


Abbildung : Treibende und getriebene Seite

Ein Port beschreibt, wie ein Treiber den Anwendungskern verwenden, oder umgekehrt, wie der Anwendungskern ein externes System ansprechen kann. In den Adaptern befindet sich der Kleber, der Anpassungen zwischen externen Systemen und den Ports übernimmt.

Da die Ports und Adapter zentral für diese Architektur sind, wurde die hexagonale Architektur auch Ports and Adapters Architecture genannt. Alle Abhängigkeiten enden bei den Ports, die Bestandteil der Applikation sind. Da es keine Abhängigkeit nach außen gibt, lässt sich die gesamte Technik -Datenbanken, APIs oder Benutzeroberflächen - austauschen, ohne eine Zeile Code in der Applikation zu ändern.


Abbildung : Richtung der Abhängigkeiten in der hexagonalen Architektur

Schauen wir uns ein Beispiel für die aufrufende Seite an. Im Adapter befindet sich ein REST-Controller für eine API. Die API gibt Aufrufe an den Kern der Anwendung weiter. Dazu kennt der Controller das Service-Interface in einem Port der Anwendung. Über Dependency Injection bekommt der Controller die zur Laufzeit benötigte Referenz auf die Implementierung des Service.


Abbildung : Verwendung der Ports auf der aufrufenden Seite

Auf der Seite der aufgerufenen Systeme kommt wieder die Dependency Inversion zum Einsatz. Der Port stellt die Schnittstelle für das Repository zur Verfügung, die der Adapter implementiert. Die konkrete Implementierung wird der Service-Implementierung über Dependency Injection zur Verfügung gestellt.


Abbildung : Verwendung der Ports auf der aufgerufen Seite

Eine Applikation hat selten exakt sechs Ports. Warum wurde dann ein Hexagon verwendet? Cockburn fand die Darstellung mit Sechsecken einfach cool.

Domain Driven Design

Die Ideen des Domain Driven Designs lassen sich gut mit der hexagonalen Architektur umsetzen.

Ein Bounded Context entspricht einem Hexagon. Die Fachlichkeit ist durch Ports von der Technik entkoppelt. Die Domain wird im Rahmen des taktischen DDD in Services, Entities usw. eingeteilt.


Abbildung : Taktisches DDD mit Annotations

Mehrere Bounded Contexts lassen sich über Adapter miteinander verbinden. Die Ports sorgen dabei für die notwendige Entkoppelung.


Abbildung : Verbindung von mehreren Bound Contexts über Ports und Adapter

Mit dem Wissen über die hexagonale Architektur ist die im nächsten Teil beschriebene Onion Architecture einfach zu verstehen.

Video

Anstatt zu lesen kannst du auch das Video zum Artikel auf YouTube anschauen.