Clean Architecture
Hľbkový pohľad na clean architektúru a jej vrstvy pre škálovateľné a udržateľné systémy.
Úvad
Architektúra softvéru zohráva kľúčovú úloha pri budovaní škálovateľných, udržateľných a flexibilných systémov. Obľúbený prístup je využitie Clean Architecture (tiež známej ako Onion alebo Hexagonal Architecture). Tento návrh rozdeľuje systém na jasne oddelené vrstvy, každá so svojou zodpovednosťou, čo umožňuje lepšiu organizáciu a dlhodobú udržateľnosť.
Hlavné vrstvy architektúry
Architektúra je rozdelená na štyri hlavné vrstvy:
- Doménová vrstva (jadro obchodnej logiky)
- Aplikačná vrstva (sluby a orchestrácia)
- Inštruktúrna vrstva (prístup k údajom a externým službám)
- Prezentačná vrstva (užívateľské rozhranie)
1. Doménová vrstva
Doménová vrstva je jadrom systému a obsahuje všetku kľúčovú obchodnú logiku. Táto vrstva je nezávislá od iných vrstiev a obsahuje:
- Entity: Reprezentujú hlavné objekty (napr.
User,Order). - Hodnotové objekty: Nemenné objekty reprezentujúce koncepty (napr.
Adresa). - Doménové služby: Logika, ktorá nepatrí priamo do entity.
- Rozhrania: Abstraktné repozitáre pre prístup k údajom.
public class Order
{
public Guid Id { get; private set; }
public string Customer { get; private set; }
public List<OrderItem> Items { get; private set; } = new();
public Order(string customer)
{
Id = Guid.NewGuid();
Customer = customer;
}
public void AddItem(OrderItem item)
{
Items.Add(item);
}
}
2. Aplikačná vrstva
Aplikačná vrstva koordinuje operácie medzi doménovou vrstvou a inými vrstvami. Obsahuje služby aplikácie, prípady použitia a validácie business operácií.
public class OrderService
{
private readonly IOrderRepository _orderRepository;
public OrderService(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
public void CreateOrder(string customer, List<OrderItem> items)
{
var order = new Order(customer);
foreach (var item in items)
{
order.AddItem(item);
}
_orderRepository.Save(order);
}
}
3. Inštruktúrna vrstva
Inštruktúrna vrstva poskytuje implementácie pre rozhrania definované v doménovéj vrstve. Zahrňa prístup k údajom, integráciu externých API a logovanie.
public class OrderRepository : IOrderRepository
{
private readonly AppDbContext _context;
public OrderRepository(AppDbContext context)
{
_context = context;
}
public void Save(Order order)
{
_context.Orders.Add(order);
_context.SaveChanges();
}
}
4. Prezentačná vrstva
Prezentačná vrstva spracúva interakciu s užívateľom. Môže zahŕňať webové API, používateľské rozhrania (napr. Blazor alebo MVC) a view modely.
[ApiController]
[Route("api/orders")]
public class OrderController : ControllerBase
{
private readonly OrderService _orderService;
public OrderController(OrderService orderService)
{
_orderService = orderService;
}
[HttpPost]
public IActionResult CreateOrder([FromBody] OrderDto dto)
{
_orderService.CreateOrder(dto.Customer, dto.Items);
return Ok();
}
}
Vizuálne znázornie architektúry
Nasledujúcí diagram znázorňuje štruktúiru vrstiev:
+-------------------------------+
| Prezentačná vrstva |
| (UI, Kontroléry, Zobrazenia) |
+---------------^---------------+
|
+---------------v---------------+
| Aplikačná vrstva |
| (Služby, Prípady použitia) |
+---------------^---------------+
|
+---------------v---------------+
| Doménová vrstva |
| (Entity, Hodnotové objekty) |
+---------------^---------------+
|
+---------------v---------------+
| Inštruktúrna vrstva |
| (Repozitáre, Externé služby) |
+-------------------------------+
Výhody tejto architektúry
- Oddelenie zodpovedností: Každá vrstva má jasnú úloha.
- Testovateľnosť: Obchodnú logiku je možné testovať samostatne.
- Udržateľnosť: Jednoduchá údržba a rozšírenie aplikácie.
- Flexibilita: Zmena infraštruktúry alebo UI neovplyvní doménovú logiku.
Záver
Vrstvená architektúra s doménovou, aplikačnou, inštruktúrnou a prezentačnou vrstvou poskytuje čisté oddelenie zodpovedností. Zabezpečuje škálovateľnosť, udržateľnosť a flexibilitu systému. Izolácia obchodnej logiky v doménovéj vrstve a smerovanie závislostí smerom dovnútra umožňujú vytvoriť robustné riešenie, ktoré vydrží dlhodobo.