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ě?
- Rozptýlená logika: Jedna feature (např. "Vytvoření objednávky") je rozptýlená ve 4+ složkách
- Merge konflikty: Dva vývojáři pracující na různých features mění stejné soubory
- Těžká orientace: Nový vývojář musí hledat napříč složkami
- 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ě:
- Nové features dělejte feature-based
- Při úpravě starého kódu ho postupně migrujte
- 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.