🧱 Clean Architecture in Angular mit Nx – Für skalierbare und wartbare Anwendungen

Clean Architecture ist kein Buzzword – sie ist ein Fundament.
Ein System, das dir hilft, auch nach 2 Jahren noch zu verstehen, warum dein Code so funktioniert – und wie du ihn erweitern kannst, ohne Angst zu haben.

In diesem Beitrag zeige ich dir, wie du Clean Architecture mit Nx im Angular-Kontext umsetzt:
modular, lesbar, zukunftssicher.


📐 Die Grundidee von Clean Architecture

Der Kern ist einfach:

  • Trennung von Verantwortung (UI, Business-Logik, Datenzugriff)
  • Unabhängigkeit von Frameworks
  • Abhängigkeiten nur nach innen (Dependency Rule)
  • Dreh- und Angelpunkt: das Domain-Modell

🔁 Die Ebenen

[ UI / Presentation ]
        ↓
[ Application Layer ]
        ↓
[ Domain Layer ]
        ↓
[ Infrastructure / Data ]

🧠 Warum Nx perfekt zur Clean Architecture passt

Nx bringt dir:

  • modulare Trennung durch Libraries
  • vollständige Kontrolle über Abhängigkeiten
  • leichtes Refactoring durch Generators
  • caching, affected builds & dependency graph out of the box

🧱 Beispielhafte Struktur mit Nx Workspace

apps/
└── web-app/

libs/
├── ui/               → Presentational Components
├── feature-user/     → Smart Components + State
├── domain-user/      → Interfaces, Entities, Use Cases
├── data-access-user/ → API-Calls, Services, HTTP

📦 Domain Layer

Das Herzstück deiner Anwendung.

// libs/domain-user/src/lib/entities/user.entity.ts
export interface User {
  id: string;
  name: string;
  email: string;
}

Use Case als Service:

export class GetUser {
  constructor(private repo: UserRepository) {}

  execute(id: string): Observable<User> {
    return this.repo.findById(id);
  }
}

🧩 Application Layer – Feature + State

Feature-Komponente ruft Use Case auf:

@Component({
  standalone: true,
  selector: 'app-user-page',
  template: `<app-user [user]="user()" />`,
})
export class UserPageComponent {
  private getUser = inject(GetUser);
  user = toSignal(this.getUser.execute('123'));
}

🌍 Infrastructure Layer – HTTP & Services

@Injectable({ providedIn: 'root' })
export class HttpUserRepository implements UserRepository {
  constructor(private http: HttpClient) {}

  findById(id: string): Observable<User> {
    return this.http.get<User>(`/api/users/${id}`);
  }
}

✅ Fazit

Clean Architecture mit Nx bringt dir:

  • Trennung von Zuständigkeiten
  • bessere Testbarkeit
  • hohe Wartbarkeit & Lesbarkeit
  • Zukunftssicherheit durch Workspace-Struktur

Es braucht etwas Disziplin – aber du wirst es dir spätestens beim dritten Feature danken.


📍 Bald verfügbar:
🧠 CQRS & Event Sourcing in Angular – Macht oder Mythos?

👉 Folge diesem Blog für mehr praxisnahe Architekturkonzepte.

Hast du Fragen oder ein Projekt im Kopf?

Ich freue mich auf deine Nachricht. Lass uns gemeinsam deine Vision verwirklichen!

Jetzt Kontakt aufnehmen