Skip to content
Tech42 Software Solutions GmbH

Einführung in die Clean Code Softwarearchitektur für Mikroservices

SRP, Dependency Inversion, DRY — was Clean Code für Mikroservices in der Praxis bedeutet, mit konkreten C#/.NET-Beispielen.

Jan Raddatz · 6 Min. Lesezeit · Clean Code / Microservices / Architektur / .NET
Clean-Code-Prinzipien für Mikroservices — Single Responsibility, Dependency Inversion und DRY in C#/.NET.

Die Mikroservices-Architektur ist eine Methode zur Entwicklung von Softwaresystemen, die in kleine, unabhängige Dienste aufgeteilt sind. Jeder Dienst läuft in seinem eigenen Prozess und kommuniziert über leichte Mechanismen, oft eine HTTP-Ressourcen-API. Die Prinzipien der Clean Code Softwarearchitektur in der Mikroservices-Architektur betonen Lesbarkeit, Wartbarkeit und Einfachheit im Design, um sicherzustellen, dass jeder Service leicht verständlich ist und unabhängig entwickelt, bereitgestellt und skaliert werden kann.

Schlüsselprinzipien

Bevor wir uns einen Überblick über die Struktur verschaffen, lassen Sie uns einige Schlüsselprinzipien der Clean Code Softwarearchitektur hervorheben, die besonders relevant für Mikroservices sind:

  • Single Responsibility Principle (SRP): Jeder Mikroservice sollte nur einen Grund zur Änderung haben, d.h., er sollte sich auf eine einzige Funktionalität oder Domäne konzentrieren.
  • Interface Segregation und Dependency Inversion: Mikroservices sollten auf Abstraktionen statt auf konkreten Implementierungen anderer Dienste oder Komponenten basieren, um lose Kopplungen zu fördern.
  • Don’t Repeat Yourself (DRY): Gemeinsam genutzte Funktionalitäten sollten abstrahiert werden, um eine Duplizierung von Code über Dienste hinweg zu vermeiden.
  • Konfiguration statt Hardcoding: Externe Konfigurationen bevorzugen, um Flexibilität und Anpassungsfähigkeit zu erhöhen.

Clean Code Prinzipien in Aktion

Um die Anwendung der Clean Code Prinzipien zu illustrieren, betrachten wir ein Beispiel eines Mikroservices in C# .NET, der eine einfache Geschäftslogik implementiert:

using System;

namespace InvoiceService
{
    public class Invoice
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public decimal Amount { get; set; }
    }

    public interface IInvoiceRepository
    {
        Invoice GetById(int id);
    }

    public class InvoiceService
    {
        private readonly IInvoiceRepository _repository;

        public InvoiceService(IInvoiceRepository repository)
        {
            _repository = repository;
        }

        public Invoice GetInvoice(int id)
        {
            if (id <= 0)
            {
                throw new ArgumentException("Invoice ID must be greater than 0.", nameof(id));
            }
            return _repository.GetById(id);
        }
    }
}

In diesem Beispiel zeigt die InvoiceService-Klasse, wie das Single Responsibility Principle (SRP) umgesetzt wird. Die Klasse hat die einzige Verantwortung, Rechnungen zu verwalten. Die Abhängigkeit zu einem IInvoiceRepository wird über den Konstruktor injiziert (Dependency Inversion Principle), was die Klasse von konkreten Implementierungsdetails abstrahiert und die Testbarkeit verbessert.

Struktureller Überblick

Die Architektur von Mikroservices unter Verwendung von Clean Code Prinzipien kann in mehrere Schichten unterteilt werden, die zusammenarbeiten, um ein kohärentes, effizientes und wartbares System zu schaffen:

  1. Präsentationsschicht. Die äußerste Schicht, verantwortlich für die Kommunikation mit dem Client. In Mikroservices umfasst dies oft leichte APIs, die HTTP/REST zum Austausch von Daten verwenden.
  2. Geschäftslogikschicht. Diese Schicht beinhaltet die Kernfunktionalität des Mikroservices, einschließlich der Geschäftsregeln und der Verarbeitungslogik. Sie folgt dem SRP, um sicherzustellen, dass der Service fokussiert und wartbar bleibt.
  3. Persistenzschicht. Verantwortlich für die Speicherung und Abfrage von Daten. In einer Mikroservices-Architektur kann dies den Zugriff auf Datenbanken, Cache-Systeme oder andere Speicherlösungen umfassen, abhängig von den spezifischen Anforderungen des Dienstes.
  4. Integrations- und Messaging-Schicht. Ermöglicht die Kommunikation zwischen Mikroservices sowie mit externen Systemen und Diensten. Diese Schicht nutzt oft asynchrone Messaging-Systeme oder Ereignisbusse, um lose gekoppelte Integrationen zu fördern.
  5. Infrastruktur- und Konfigurationsschicht. Umfasst Aspekte wie Service-Discovery, Load Balancing, Konfigurationsmanagement und Sicherheit. Diese Schicht stellt die notwendige Infrastruktur bereit, um die Mikroservices effizient und sicher zu betreiben.

Struktureller Überblick mit C# .NET Beispielen

Präsentationsschicht. In einem Mikroservice, der ASP.NET Core verwendet, könnten Endpunkte definiert werden, die die Geschäftslogik über HTTP exponieren:

public class InvoiceController : ControllerBase
{
    private readonly InvoiceService _service;

    public InvoiceController(InvoiceService service)
    {
        _service = service;
    }

    [HttpGet("{id}")]
    public ActionResult<Invoice> GetInvoice(int id)
    {
        try
        {
            var invoice = _service.GetInvoice(id);
            return Ok(invoice);
        }
        catch (ArgumentException ex)
        {
            return BadRequest(ex.Message);
        }
    }
}

Geschäftslogikschicht. Die Kernfunktionalität, wie im InvoiceService-Beispiel gezeigt.

Persistenzschicht. Implementierung des IInvoiceRepository, um Daten in einer Datenbank zu speichern und abzufragen.

Integrations- und Messaging-Schicht. Die Verwendung von Messaging-Diensten wie RabbitMQ oder Kafka zur Kommunikation zwischen Mikroservices.

Infrastruktur- und Konfigurationsschicht. Konfigurationsmanagement durch externe Einstellungen in appsettings.json oder Umgebungsvariablen.

Fazit

Die Implementierung von Clean Code Prinzipien in der Mikroservices-Architektur stellt eine solide Grundlage für die Entwicklung skalierbarer, wartbarer und effizienter Software dar. Durch eine klare Trennung der Verantwortlichkeiten, die Förderung von lose gekoppelten Diensten und die Konzentration auf eine saubere, verständliche Codebasis können Teams robuste Systeme entwickeln, die den Anforderungen moderner Anwendungen gerecht werden.

Tech42 unterstützt seine Kunden bei der Gestaltung und Implementierung maßgeschneiderter Software-Lösungen auf Basis von Clean Code und moderner Software-Architektur. Wenn Sie Fragen zu Ihrem konkreten Projekt haben, sprechen Sie uns an.

Lust auf ein Gespräch?

Wenn Sie hier weitergelesen haben, lohnt sich vielleicht auch ein direktes Gespräch. Erstgespräch unverbindlich.