Hexagonale Architektur
Dieser Beitrag ist eine Begriffserklärung zur Hexagonalen Architektur (Ports and Adapters) – inklusive typischer Prüfungsfragen, kurzer Merkpunkte und Tags zur Wiederholung.
Was ist die Hexagonale Architektur?
Die Hexagonale Architektur (auch Ports and Adapters) ist ein Architekturansatz, der den fachlichen Kern (Domäne / Use Cases) strikt von äußeren Abhängigkeiten trennt – etwa:
- UI (Web, Mobile, CLI)
- Datenbank
- Message Broker
- externe APIs
Die Grundidee: Der Kern definiert, was er braucht (Ports/Schnittstellen). Die Infrastruktur liefert austauschbare Implementierungen (Adapter).
Die Bausteine: Domäne, Ports, Adapter
Domänenkern
Im Zentrum liegt die Fachlogik:
- Entities / Value Objects
- Use Cases / Application Services
- Geschäftsregeln
Ports
Ports sind Schnittstellen, die die Richtung der Abhängigkeit festlegen:
- Inbound Ports: Was die Anwendung anbietet (Use Cases, Commands)
- Outbound Ports: Was die Anwendung benötigt (Repositories, Payment, Mail, Logging)
Adapter
Adapter verbinden Ports mit konkreter Technik:
- Inbound Adapter: REST Controller, GraphQL Resolver, CLI, Scheduler
- Outbound Adapter: DB-Repository, HTTP-Client, Cache, Message Producer
Warum ist das hilfreich? (Vorteile)
- Testbarkeit: Kernlogik lässt sich ohne DB/HTTP testen (Mocks/Fakes auf Ports)
- Austauschbarkeit: Technologie-Wechsel betrifft Adapter, nicht den Kern
- Geringere Kopplung: weniger Framework-Abhängigkeiten im Domain-Code
- Saubere Verantwortlichkeiten: klare Systemgrenzen
Typische Nachteile / Trade-offs
- Mehr Abstraktion (Ports/Adapter) = mehr Artefakte
- Höherer Initialaufwand (Wiring, DI, Mapping)
- Lernkurve für Teams, die „direkt gegen Frameworks“ entwickeln
Mini-Praxisbeispiel (vereinfacht)
Idee
Ein Use Case „Bestellung bezahlen“ kennt nur Ports. Ein Stripe-Adapter oder ein DB-Adapter kann später ausgetauscht werden.
// Inbound Port
export interface PayOrderUseCase {
pay(orderId: string): Promise<string>;
}
// Outbound Ports
export interface OrderRepositoryPort {
findById(orderId: string): Promise<any>;
save(order: any): Promise<void>;
}
export interface PaymentProviderPort {
charge(amountInCents: number, customerId: string): Promise<{ transactionId: string }>;
}
Typische Prüfungsfragen (mit Kurzantwort)
- Was ist das Ziel der hexagonalen Architektur? Entkopplung der Fachlogik von technischen Details über Ports und Adapter.
- Inbound vs. Outbound Adapter – Unterschied? Inbound bringt Anfragen in den Kern, Outbound implementiert Infrastrukturzugriffe.
- Wie wird Dependency Inversion hier umgesetzt? Der Kern definiert Ports (Interfaces), die Infrastruktur implementiert sie.
- Warum ist das IHK-relevant? Du kannst Architekturentscheidungen mit Testbarkeit, Wartbarkeit und Austauschbarkeit begründen.
Fazit
Die hexagonale Architektur eignet sich besonders, wenn du langfristige Wartbarkeit, gute Tests und Technologie-Unabhängigkeit priorisierst.