4. Hexagonal Architecture (Onion / Ports and Adapters)
07 Mart 2025
Hexagonal Mimari Nedir?
Serinin 3. Yazısı : 3. Event Sourcing ile Veri Yönetimi
Hexagonal Architecture (Altıgen Mimari), bağımlılıkları yönetmek ve uygulama katmanlarını soyutlamak amacıyla kullanılan bir yazılım mimari desenidir. Alistair Cockburn tarafından tanıtılmıştır ve "Onion Architecture" veya "Ports and Adapters" olarak da bilinir.
Bu mimarinin temel amacı, iş mantığını (business logic) dış dünyadan tamamen soyutlamak ve uygulama içindeki farklı katmanların birbirinden bağımsız çalışmasını sağlamaktır. Bu sayede veri erişimi, kullanıcı arayüzü ve diğer dış sistemlerle olan bağımlılıkları minimize ederiz.
Geleneksel Katmanlı Mimari vs. Hexagonal Mimari
Özellik |
Katmanlı Mimari (Layered Architecture) |
Hexagonal Mimari (Onion Architecture) |
Bağımlılık Yönetimi |
İç içe katmanlardan oluşur, bağımlılıklar doğrudan eklenir |
Bağımlılıklar soyutlanır, her bileşen dış dünyadan bağımsız çalışır |
Bağlantı Yapısı |
Üst katmanlar alt katmanlara doğrudan bağımlıdır |
"Port" ve "Adapter" mekanizması ile bileşenler birbirinden ayrılır |
Test Edilebilirlik |
Bağımlılıklar nedeniyle ünite testleri zorlaşabilir |
İş mantığı bağımsız olduğu için test edilmesi kolaydır |
Esneklik |
Değişiklikler tüm katmanları etkileyebilir |
Dış dünyadan gelen değişiklikler iş mantığını etkilemez |
Hexagonal Mimari Nasıl Çalışır?
Hexagonal Architecture, "İç Çekirdek (Core)", "Portlar (Ports)" ve "Adaptörler (Adapters)" olmak üzere üç ana bileşenden oluşur:
1 - Çekirdek (Core Layer):
- İş mantığını içerir (Entities, Domain Services, Use Cases)
- Harici sistemlerden tamamen bağımsızdır.
2 - Portlar (Ports Layer):
- İş mantığı ile dış dünya arasındaki bağlantıyı sağlar.
- API, veritabanı, dosya sistemleri gibi dış servislerle etkileşimi belirler.
3 - Adaptörler (Adapters Layer):
- Port’lara bağlanan dış bileşenlerdir.
- Web API, CLI, veritabanı bağlantıları veya UI gibi yapılar adaptörlerdir.
.NET Core ile Hexagonal Architecture Uygulaması
Aşağıdaki kod örneğinde, Hexagonal Architecture prensiplerine uygun bir yapı ile ürün yönetimi uygulaması geliştireceğiz.
1- Domain Katmanı (Çekirdek)
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public interface IProductRepository
{
void AddProduct(Product product);
Product GetProductById(Guid id);
}
2 - Ports (Bağlantı Katmanı)
public interface IProductService
{
void CreateProduct(string name, decimal price);
Product GetProduct(Guid id);
}
3 - Application Service (İş Mantığı Katmanı)
public class ProductService : IProductService
{
private readonly IProductRepository _repository;
public ProductService(IProductRepository repository)
{
_repository = repository;
}
public void CreateProduct(string name, decimal price)
{
var product = new Product { Id = Guid.NewGuid(), Name = name, Price = price };
_repository.AddProduct(product);
}
public Product GetProduct(Guid id)
{
return _repository.GetProductById(id);
}
}
4 - Adaptörler (Veritabanı Erişimi ve API Katmanı)
public class ProductRepository : IProductRepository
{
private readonly List<Product> _products = new();
public void AddProduct(Product product)
{
_products.Add(product);
}
public Product GetProductById(Guid id)
{
return _products.FirstOrDefault(p => p.Id == id);
}
}
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;
public ProductsController(IProductService productService)
{
_productService = productService;
}
[HttpPost]
public IActionResult CreateProduct([FromBody] Product product)
{
_productService.CreateProduct(product.Name, product.Price);
return Ok();
}
[HttpGet("{id}")]
public IActionResult GetProduct(Guid id)
{
var product = _productService.GetProduct(id);
return product != null ? Ok(product) : NotFound();
}
}
Hexagonal Architecture, esneklik, test edilebilirlik ve bağımsız bileşenler sağlayarak mikroservisler ve büyük ölçekli projeler için ideal bir mimari modeldir. Özellikle, değişen dış sistemlerden etkilenmeden çekirdek iş mantığının korunmasını sağlar.
Serinin 3. Yazısı : 3. Event Sourcing ile Veri Yönetimi
Yorumlar