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:

- Çekirdek (Core Layer):

  • İş mantığını içerir (Entities, Domain Services, Use Cases)
  • Harici sistemlerden tamamen bağımsızdır.

- 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.

- 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