
Architekturen im Vergleich: Onion oder Vertical Slice?
Wir setzen seit vielen Jahren erfolgreich auf die Onion-Architektur in unseren Applikationen. In den letzten Projekten haben wir jedoch auch die Vertical-Slice-Architektur eingesetzt. In diesem Blogbeitrag stellen wir beide Ansätze vor, teilen unsere Erfahrungen und zeigen auf, in welchen Situationen welche Architektur die bessere Wahl ist.
Onion Architektur
Die Onion Architektur wurde 2008 von Jeffrey Palermo vorgestellt und beruht auf Dependency Inversion (eines der SOLID Prinzipien). Die Abhängigkeiten zeigen immer nach innen, nie nach aussen.
Im Core werden die Geschäftslogik und Interfaces definiert, die aber unabhängig von der Technologie Implementation in der Infrastrukturschicht sind. Zur Laufzeit wird die Implementation via Dependency Injection geladen, was ein Austauschen einzelner Komponenten wie z.B. der Datenbank erlaubt, ohne notwendige Anpassung an der Geschäftslogik. Dieses Konzept erlaubt es zudem die Geschäftslogik unabhängig der äusseren Schichten zu testen.
Die Schichten werden mit konzentrischen Kreisen dargestellt, die an eine Zwiebel erinnern, daher der Name.

Core Layer
Der Core Layer enthält die Geschäftslogik und die Domänenmodelle, Entitäten, Interfaces und Services.
- Das Ziel ist die Unabhängigkeit von Frameworks, Datenbanken oder UI. Diese Schicht kennt nur die Logik, keine spezifische Technologie.
- Die Logik kann isoliert getestet werden und bleibt stabil, auch wenn sich die äussere Technologie ändert.
Infrastruktur Layer
Der Infrastruktur Layer implementiert Datenbank Zugriffe, Logging, Zugriff auf externe APIs und Filezugriffe
- Implementiert die technischen Interfaces aus dem Core Layer und stellt dadurch technische Funktionalität bereit.
- Die Technologie kann ausgetauscht werden, ohne die Geschäftslogik aus dem Core Layer zu verändern.
Presentation Layer
Der Presentation Layer implementiert UI, Web-Frontend, REST-Controller usw.
- Präsentiert Daten, nimmt Eingaben entgegen und kommuniziert über Services mit dem Core Layer
- UI kann unabhängig von der Logik entwickelt und verändert werden.
Es gibt neben der Onion Architektur noch die Hexagonale Architektur von Alistair Cockburn (2005) und die Clean Architektur von Robert C. Martin (2012), diese drei Architekturen sind sich sehr ähnlich.
Vertical Slice Architektur
Die Vertical Slice Architektur wurde von Jimmy Bogard entworfen. Die Hauptcharakteristik der Architektur ist ein Use-Case / Feature orientierte Strukturierung. Ziel ist eine geringe Kopplung zwischen Slices und eine hohe Kohäsion innerhalb der Slices zu erreichen. Dadurch wird ein möglichst einfaches Hinzufügen oder Ändern von Features ermöglicht. In beiden Fällen wird bestehender Code nicht verändert und die Anpassung ist in der Regel lokal begrenzt (pro Slice). Dies entspricht dem Open/Close Prinzip von SOLID.
Durch die getrennten Slices besteht die Gefahr von Code-Duplikaten. Um dies zu verhindern können gemeinsam verwendete Methoden und Datenzugriffe in gemeinsame Services ausgelagert oder via Repository Design Pattern die Datenzugriffe abstrahiert.

Folgendes Beispiel visualisiert die Funktionsweise der Vertical Slice Architektur: Der Rest Controller nimmt einen Post entgegen und schickt eine Message an den Mediator. Dieser leitet die Message an den entsprechenden Handler für die Ausführung der Geschäftslogik weiter. Schlussendlich wird das Ergebnis via Repository in die DB geschrieben.
Der Mediator ist nicht zwingend nötig, sorgt aber für zusätzliche Entkopplung und lässt sich gut via Dependency Injection integrieren. Wir haben in den letzten Projekten MediatR mit FluentValidation und Automapper verwendet.

Der Einsatz bietet folgende Vorteile:
- Bietet integrierte Methoden für Request/Response (Command oder Query an einen Handler) als auch Benachrichtigungen via Notification (an mehrere Handler).
- Pipeline Behaviors ermöglicht Logging, Validierung (FluentValidation) und Fehlerhandling zentraler mit weniger Code umzusetzen.
- Ermöglicht eine bessere Entkopplung & Testbarkeit, da via MediatR kommuniziert wird und durch diese Entkopplung weniger Mocks bei Unittests benötigt werden.
- Open/Close Prinzip: Neue Funktionalitäten werden via neue Handler oder Behaviors hinzugefügt.
- Automapper mappt Objekte regelbasiert.
Vergleich
| Kriterium | Onion Architektur | Vertical Slice Architektur |
|---|---|---|
| Geringe Komplexität der Applikation z. B. Adressverwaltung (CRUD) |
Weniger geeignet, da viel Overhead. | Sehr gut geeignet, da einfache Wartung, klare Feature-Struktur, wenig Overhead. |
| Mittlere Komplexität der Applikation z. B. Buchungssystem für Meetingräume (mehrere Use Cases mit einfacher, eher isolierter Geschäftslogik) |
Gut geeignet, besonders bei geplanter langfristiger Nutzung der Applikation. | Sehr gut geeignet, schnelle Entwicklung, gute Strukturierung nach Features. |
| Hohe Komplexität der Applikation z. B. Fahrzeugflottenverwaltung mit Einsatzplanung, Wartungsmanagement und Kostenkontrolle |
Sehr gut geeignet für komplexe oder geteilte Fachlogik und bei Verwendung von DDD (Domain-Driven Design). | Möglich, aber eher für klar abgegrenzte Use Cases, die möglichst wenig gemeinsame Logik benötigen. |
| Modularität / Isolation | Trennung nach Layer. Ziel ist die Geschäftslogik von der technischen Umsetzung zu trennen. | Trennung nach Feature bzw. Use Case. Ziel ist Features unabhängig umsetzen oder ändern zu können. |
| Testbarkeit | Sehr gut. Fokus auf Geschäftslogiktests, gute Regressionstestbarkeit, auch in Kombination mit E2E-Tests. | Sehr gut. Fokus auf E2E-Tests, um das Feature-Verhalten zu prüfen. Debuggen mit MediatR ist aufwändiger, gute Struktur ist zwingend. |
| Entkopplung von Infrastruktur | Sehr hoch, Infrastruktur ist von der Geschäftslogik isoliert und leicht austauschbar. | Möglich, aber oft weniger strikt umgesetzt. |
| Wartbarkeit | Gut, wenn die Schichten sauber gehalten werden. | Sehr gut, da Änderungen oft nur einen Slice betreffen. |
| Querschnittliche Konzepte (Logging, Error Handling, usw.) | Zentralisiert und gut kontrollierbar. | Müssen pro Slice bedacht oder abstrahiert werden. Behaviors von MediatR helfen hier. |
| Lernkurve / Einstieg und Entwicklungsgeschwindigkeit | Erfordert Verständnis von Layering, Dependency Inversion und ggf. DDD. Weniger Boilerplate, aber mehr Schichtendurchlauf und höherer Initialaufwand. | Entwickler können sich auf einzelne Features konzentrieren, müssen sich aber evtl. in MediatR einarbeiten. Schnell bei paralleler Entwicklung, aber mehr Boilerplate pro Feature, dafür hohe Autonomie bei Teamarbeit. |
Fazit
Die Onion Architektur eignet sich ideal für langfristige Anwendungen, bei denen Testbarkeit, Entkopplung der Infrastruktur und Wartbarkeit im Vordergrund stehen. Der etwas höhere initiale Aufwand lohnt sich besonders bei komplexen Systemen oder wenn viele Features auf gemeinsamer Logik aufbauen.
Die Vertical Slice Architektur ist besonders geeignet für Microservices oder agile Projekte mit eher klar abgegrenzten Use Cases und weniger geteilter komplexer Domänenlogik. Sie spielt ihre Stärken aus, wenn schnell Features geliefert, bzw. angepasst werden müssen oder viele Entwickler unabhängig am Projekt arbeiten sollen.
In unseren Projekten setzen wir auch auf eine Kombination beider Architekturen:
Die Onion Architektur bildet das strukturelle Fundament mit klarer Trennung von Domain, Application, Infrastructure und Presentation Layer.
Innerhalb der Applikations-Schicht sind die Use Cases als Vertical Slices mit MediatR, Commands, Queries und Handlers umgesetzt.
Diese Kombination ermöglicht eine hohe Wartbarkeit, sowohl auf Feature Ebene als auch bei technologischen Änderungen in der Infrastruktur. Der Preis dafür ist ein gewisser Mehraufwand durch Boilerplate Code, der sich jedoch durch die Vorteile in Struktur, Testbarkeit und Wartbarkeit rasch rechtfertigt.
CSA Engineering AG verfügt über das Know-how und die Erfahrung, um diese Architekturen effizient umzusetzen. Wir unterstützen Sie gerne bei der Konzeption und Entwicklung Ihrer Softwarelösungen.
Patrick Heiniger
Dipl. Techniker HF in Informatik / NDS Software Engineering SWS
Software Engineer
Über den Autor
Patrick Heiniger arbeitet seit über 19 Jahren als Software-Ingenieur bei der CSA.
Er unterstützt Kunden im .NET-Umfeld bei der Architektur und Entwicklung von Web und Cloud Projekten. Durch sein Interesse an neuen Technologien und seine Motivation sich stetig weiterzubilden ist er stets am Puls der Technologie.