Architekturmuster in C#: Chaos in Ordnung verwandeln

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Architekturmuster in C#: Lassen Sie nicht zu, dass Ihr Code zu Spaghetti wird

\n\n

Jeder C#-Entwickler stößt früher oder später auf den Moment, in dem sein Projekt beginnt, an einen Teller überkochter Nudeln zu erinnern. Methoden mit 500 Zeilen, Klassen, die „alles wissen“, und Bugs, die sich schneller vermehren als Kaninchen. Kommt Ihnen das bekannt vor? Höchste Zeit, über Architekturmuster in C# zu sprechen.

\n\n

In diesem Artikel werden wir keine langweiligen Vorträge halten. Wir werden uns ansehen, welche Architekturmuster in C# Projekte wirklich retten, zeigen C#-Codebeispiele und geben klare Auswahlkriterien. Los geht's!

\n\n

MVC-Muster: Ein Klassiker, der nie altert

\n\n

Model-View-Controller (MVC) ist wohl das beliebteste Architekturmuster in C# für Webanwendungen. Seine Hauptidee ist es, die Verantwortung auf drei Säulen aufzuteilen: Daten (Model), Darstellung (View) und Steuerungslogik (Controller).

\n\n

Wie funktioniert das in der Praxis?

\n\n

Stellen Sie sich einen Online-Shop vor. Der Benutzer klickt auf die Schaltfläche „In den Warenkorb“ – das ist ein Signal für den Controller. Der Controller bittet das Model, die Daten zu aktualisieren. Das Model sagt: „Fertig!“. Der Controller wählt eine passende View aus und sendet ihr die aktuellen Daten. Die View zeichnet einfach das, was sie erhalten hat.

\n\n

Hier ist ein minimales C#-Codebeispiel für ASP.NET Core MVC:

\n\n
// Model\npublic class Product\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public decimal Price { get; set; }\n}\n\n// Controller\npublic class ProductController : Controller\n{\n    private readonly AppDbContext _context;\n\n    public ProductController(AppDbContext context)\n    {\n        _context = context;\n    }\n\n    public IActionResult Index()\n    {\n        var products = _context.Products.ToList();\n        return View(products); // View entscheidet selbst, wie die Liste dargestellt wird\n    }\n}
\n\n

Wann verwenden: Webanwendungen mit umfangreicher Benutzeroberfläche, bei denen Logik und Darstellung klar getrennt werden müssen. Ideal für C#-Anwendungsarchitektur auf ASP.NET Core.

\n\n

MVP-Muster: Für diejenigen, die mit Windows Forms befreundet sind

\n\n

Model-View-Presenter (MVP) ist der große Bruder von MVC, der sich besonders gut für Desktop-Anwendungen mit WinForms oder WPF eignet. Der Hauptunterschied: Die View ist ein passiver „Dummy“, während der Presenter den gesamten Prozess steuert.

\n\n

Beispiel für WinForms

\n\n
// View-Schnittstelle (passiv)\npublic interface ILoginView\n{\n    string UserName { get; }\n    string Password { get; }\n    event EventHandler LoginClicked;\n    void ShowError(string message);\n}\n\n// Presenter (aktiver Dirigent)\npublic class LoginPresenter\n{\n    private readonly ILoginView _view;\n    private readonly IAuthService _authService;\n\n    public LoginPresenter(ILoginView view, IAuthService authService)\n    {\n        _view = view;\n        _authService = authService;\n        _view.LoginClicked += OnLoginClicked;\n    }\n\n    private void OnLoginClicked(object sender, EventArgs e)\n    {\n        if (_authService.Authenticate(_view.UserName, _view.Password))\n        {\n            // Übergang zum Hauptformular\n        }\n        else\n        {\n            _view.ShowError("Ungültiger Benutzername oder Passwort");\n        }\n    }\n}
\n\n

Vorteil: Die View kann leicht getestet werden, indem man sie durch ein Mock-Objekt ersetzt. Nachteil: Es wird mehr Code, aber dieser wird vorhersagbar.

\n\n

Repository-Muster: Die Komplexität der Datenbank verbergen

\n\n

Repository-Muster in C# ist eine Zwischenschicht zwischen der Geschäftslogik und dem Datenspeicher. Anstatt SQL-Abfragen über den gesamten Code zu verstreuen, erstellen Sie ein einheitliches „Repository“ für die Arbeit mit Entitäten.

\n\n

Beispiel mit Entity Framework Core

\n\n
public interface IProductRepository\n{\n    Task<Product> GetByIdAsync(int id);\n    Task<IEnumerable<Product>> GetAllAsync()                

Blogs

Buchempfehlungen