Architektura warstwowa, czysta architektura oraz architektura porty-adaptery w .NET Core

Architektura warstwowa, czysta architektura oraz hexagonalna w .NET

Współczesne aplikacje wymagają przejrzystej struktury, która ułatwia rozwój, testowanie oraz utrzymanie kodu. W świecie .NET Core popularnością cieszą się trzy podejścia architektoniczne: architektura warstwowa, czysta architektura (Clean Architecture) oraz architektura porty-adaptery (Hexagonal Architecture). W tym artykule szczegółowo przedstawiamy każdą z nich, omawiając zalety, wady, przykłady implementacji oraz wskazując najlepsze zastosowania.

Architektura warstwowa (Layered Architecture)

Szczegółowy opis:

Architektura warstwowa dzieli aplikację na trzy podstawowe warstwy:

  • Prezentacja (Presentation Layer) – zarządza UI oraz obsługą żądań użytkowników.

  • Logika biznesowa (Business Logic Layer) – implementuje reguły biznesowe.

  • Dostęp do danych (Data Access Layer) – komunikuje się z bazą danych.

Plusy:

  • Łatwa w implementacji i zrozumieniu.

  • Ułatwia zarządzanie projektem i podział obowiązków.

Minusy:

  • Potencjalne nadmierne zależności między warstwami.

  • Trudniejsza izolacja logiki biznesowej.

Przykład kodu w C#:

Presentation Layer:

				
					public class HomeController : Controller
{
    private readonly IUserService _userService;

    public HomeController(IUserService userService)
    {
        _userService = userService;
    }

    public IActionResult Index(int userId)
    {
        var user = _userService.GetUserDetails(userId);
        return View(user);
    }
}
				
			

Business Logic Layer:

				
					public class UserService : IUserService
{
    private readonly IUserRepository _repository;

    public UserService(IUserRepository repository)
    {
        _repository = repository;
    }

    public UserDetails GetUserDetails(int id)
    {
        return _repository.FetchUserDetails(id);
    }
}
				
			

Zastosowanie:

  • Idealna dla mniejszych i średnich aplikacji wymagających szybkiego wdrożenia.

Link zewnętrzny:

Czysta architektura (Clean Architecture)

Szczegółowy opis:

Czysta architektura, stworzona przez Roberta C. Martina, wyróżnia się odwróceniem zależności oraz izolacją logiki domenowej. Składa się z następujących warstw:

  • Domain/Core – encje i logika domenowa.

  • Application – zarządza przepływem aplikacji.

  • Infrastructure – szczegóły techniczne (baza danych, integracje zewnętrzne).

  • Presentation – interfejs użytkownika, API.

Plusy:

  • Wysoka testowalność.

  • Izolacja od technologii zewnętrznych.

Minusy:

  • Wymaga dużej dyscypliny zespołu.

  • Bardziej skomplikowana struktura.

Przykład kodu w C#:

Application Layer:

				
					public class CreateOrderCommand
{
    public List<OrderItemDto> Items { get; set; }
}

public class CreateOrderHandler
{
    private readonly IOrderRepository _repository;

    public CreateOrderHandler(IOrderRepository repository)
    {
        _repository = repository;
    }

    public void Handle(CreateOrderCommand command)
    {
        var order = new Order();
        foreach (var item in command.Items)
            order.AddItem(new OrderItem(item.ProductId, item.Quantity));

        _repository.Add(order);
    }
}
				
			

Zastosowanie:

  • Świetna dla dużych systemów, które wymagają dużej elastyczności i skalowalności.

Link zewnętrzny:

Architektura porty-adaptery (Hexagonal Architecture)

Szczegółowy opis:

Hexagonal architecture koncentruje się na izolacji domeny aplikacji, definiując interfejsy (porty) oraz ich konkretne implementacje (adaptery). Główne elementy:

  • Porty – interfejsy do komunikacji z zewnętrznymi komponentami.

  • Adaptery – implementacje techniczne komunikujące się z portami.

  • Application Core – logika domenowa aplikacji.

Plusy:

  • Elastyczność technologiczna.

  • Łatwość testowania i utrzymania.

Minusy:

  • Wymaga więcej czasu na początkową konfigurację.

  • Konieczna dobra znajomość abstrakcji i interfejsów.

Przykład kodu w C#:

Port (Core):

				
					public interface IPaymentService
{
    bool ProcessPayment(PaymentDetails details);
}
				
			

Adapter:

				
					public class StripePaymentService : IPaymentService
{
    public bool ProcessPayment(PaymentDetails details)
    {
        // Implementacja integracji z API Stripe
        return true;
    }
}
				
			

Zastosowanie:

  • Doskonała w systemach, które często zmieniają technologie zewnętrzne lub wymagają szczególnie mocnej izolacji logiki biznesowej.

Link zewnętrzny:


Podsumowanie

Każde z przedstawionych podejść ma własne atuty i ograniczenia. Wybór odpowiedniej architektury powinien uwzględniać specyfikę projektu, jego rozmiar, wymagania biznesowe oraz kompetencje zespołu. Dzięki temu artykułowi zyskasz solidne podstawy do podjęcia świadomej decyzji przy wyborze najlepszej struktury architektonicznej dla swojej aplikacji .NET Core.

Udostępnij:

Powiązane posty