Problém tradičního přístupu

Klasická layer-based architektura organizuje kód podle technických vrstev:

📁 src/
  📁 Controllers/
    📄 OrderController.cs
    📄 ProductController.cs
    📄 CustomerController.cs
  📁 Services/
    📄 OrderService.cs
    📄 ProductService.cs
    📄 CustomerService.cs
  📁 Repositories/
    📄 OrderRepository.cs
    📄 ProductRepository.cs
    📄 CustomerRepository.cs
  📁 Models/
    📄 Order.cs
    📄 Product.cs
    📄 Customer.cs

Co je špatně?

  1. Rozptýlená logika: Jedna feature (např. "Vytvoření objednávky") je rozptýlená ve 4+ složkách
  2. Merge konflikty: Dva vývojáři pracující na různých features mění stejné soubory
  3. Těžká orientace: Nový vývojář musí hledat napříč složkami
  4. Coupling: Tendence k vytváření "god services" se stovkami řádků

Feature-Based architektura

Organizace podle business features - vertical slices:

📁 src/
  📁 Features/
    📁 Orders/
      📁 CreateOrder/
        📄 CreateOrderEndpoint.cs
        📄 CreateOrderHandler.cs
        📄 CreateOrderRequest.cs
        📄 CreateOrderValidator.cs
        📄 CreateOrderTests.cs
      📁 GetOrder/
        📄 GetOrderEndpoint.cs
        📄 GetOrderHandler.cs
      📁 Shared/
        📄 Order.cs
        📄 OrderRepository.cs
    📁 Products/
      📁 CreateProduct/
        ...
    📁 Customers/
      ...

Výhody:

  • Vše pohromadě: Celá feature v jedné složce
  • Minimální konflikty: Každý vývojář pracuje v jiné složce
  • Snadné mazání: Nepotřebujete feature? Smažte složku.
  • Lepší testování: Testy vedle kódu
  • Nezávislý deployment: Snadnější microservices extrakce

Proč je to budoucnost pro AI development

S příchodem AI-assisted coding (GitHub Copilot, Claude, Cursor) se feature-based architektura stává ještě důležitější:

1. Lepší context pro AI

AI nástroje pracují s omezeným kontextem. Když je celá feature v jedné složce:

  • AI vidí všechny související soubory najednou
  • Lépe chápe intent a business logiku
  • Generuje konzistentnější kód
// S feature-based: AI vidí celý context
📁 CreateOrder/
  📄 Endpoint.cs    ← API definice
  📄 Handler.cs     ← Business logika
  📄 Validator.cs   ← Validační pravidla
  📄 Tests.cs       ← Příklady použití

// S layer-based: AI musí skákat mezi složkami
📁 Controllers/    → 📁 Services/    → 📁 Repositories/

2. Snazší generování nových features

AI může snadno zkopírovat existující feature jako template:

// Prompt: "Vytvoř feature UpdateOrder podobnou jako CreateOrder"
// AI má jasný vzor v jedné složce

3. Bezpečnější refaktoring

Změny jsou izolované - AI i člověk vidí všechny dopady změny v jednom místě.

Jak začít?

1. Nedělejte big bang rewrite

Migrujte postupně:

  1. Nové features dělejte feature-based
  2. Při úpravě starého kódu ho postupně migrujte
  3. Společný kód nechte ve Shared složce

2. Minimální struktura feature

📁 Features/
  📁 YourFeature/
    📄 YourFeatureEndpoint.cs   // API endpoint (minimal, deleguje na handler)
    📄 YourFeatureHandler.cs    // Business logika
    📄 YourFeatureRequest.cs    // Input DTO
    📄 YourFeatureResponse.cs   // Output DTO (pokud potřeba)

3. Příklad implementace

// Features/Orders/CreateOrder/CreateOrderEndpoint.cs
public class CreateOrderEndpoint : Endpoint<CreateOrderRequest, CreateOrderResponse>
{
    public override void Configure()
    {
        Post("/orders");
        AllowAnonymous();
    }

    public override async Task HandleAsync(CreateOrderRequest req, CancellationToken ct)
    {
        var order = await _handler.HandleAsync(req, ct);
        await SendAsync(new CreateOrderResponse(order.Id));
    }
}

// Features/Orders/CreateOrder/CreateOrderHandler.cs
public class CreateOrderHandler
{
    public async Task<Order> HandleAsync(CreateOrderRequest request, CancellationToken ct)
    {
        var order = new Order
        {
            CustomerId = request.CustomerId,
            Items = request.Items.Select(i => new OrderItem(i.ProductId, i.Quantity)).ToList()
        };

        await _db.Orders.AddAsync(order, ct);
        await _db.SaveChangesAsync(ct);

        return order;
    }
}

Nástroje a frameworky

  • FastEndpoints - .NET framework přímo navržený pro vertical slices
  • MediatR - CQRS pattern, dobře se hodí k feature-based
  • Minimal APIs - .NET 6+ lightweight endpoints

Závěr

Feature-based architektura není jen o organizaci složek. Je to způsob myšlení, který:

  • Zrychluje vývoj (méně kontextového přepínání)
  • Snižuje chyby (izolované změny)
  • Připravuje na AI-assisted development
  • Usnadňuje škálování týmu

V SolutionBox používáme feature-based architekturu na všech projektech. Ozvěte se pokud chcete poradit s migrací nebo novým projektem.