Onion Architecture Mimarisi

Ahmet Selçuk Özdemir
4 min readNov 13, 2022

Merhabalar,

Bu yazımda 2008 yılında Jeffrey Palermo tarafından tasarlanmış olan Onion Architecture yazılım mimarisinden bahsedeceğim.Öncelikle Onion Architecture nedir bu soruya cevap verelim.

Günümüzde inşa edilen bir yazılımın gelecekteki teknolojilere ve yaklaşımlara veya yeni ihtiyaçlara hızlıca adapte olabilmesi oldukça önemlidir.Bu yüzden geliştirilen uygulamanın gelecek vadedebilmesi için iyi kurgulanmış olması oldukça önemlidir.

Onion Architecture, yazılım süreçlerine daha gelişmiş bir katmansal mimari sunarak, klasik çok katmanlıdaki bazı problemleri aşabilmemizi ayrıca olabilecek değişiklik durumlarında daha az çaba sarf edilerek hızlı bir çözüm sunmamızı ve tüm bunları yaparken uygulama katmanları arasında gevşek bağlılık(loose coupling) oluşturmamızı sağlayan bir mimaridir.

Onion architecture’da her katman kendinden bir önceki katmanı referans eder.

Öncelikle aşağıdaki görseli incelemenizi istiyorum.

Şimdi bu mimariyi katman katman anlatmaya çalışalım.

Domain Katmanı ;

Domain onion architecture’in merkezi katmanıdır.

İçerisinde domain katmanı ile çalışacak olan bütün nesnelerimiz yani entities,value object,enumeration,exceptions(entity ile ilgili exceptions) gibi yapılanmalar bulunmaktadır.

Domain entities ve core katmanı olarak da geçebilir.

Repository & Service Interfaces / Core Katmanı;

Domain katmanı ile iş katmanı arasındaki soyutlama işlemini yaptığımız katmandır.Bu yüzden domain katmanını referans eder.

Repository,service gibi tüm arayüzleri(interfaceleri) bu katmanda tanımlanır.

İçerisinde DTO,ViewModel,Mapping,Validators,CQRS Pattern,Interfaces(Repository, UnitOfWork) gibi yapılanmalar bulunmaktadır.

Bu katmanda amaç veri erişiminde gevşek bağlı (loose coupling) bir yaklaşım sağlamaktır.Bir diğer adı da application katmanıdır.

Persistance Katmanı ;

Persistance katmanı veritabanı/veri erişim mantığını yürüten katmandır.

Application katmanındaki repository interface’lerinin concrete nesneleri burada oluşacaktır.

DbContext,Migrations, Configuration, Seeding,Repository Concrete classlar’da burada bulunacaktır.

Ayrıca en dış katman olduğu için bu katmana herhangi bir katman bağımlılık göstermeyecektir.

Infrastructure Katmanı ;

Persistance katmanı ile bütünleşebilen bir katmandır diyebiliriz.Sonuçta her ikisi de business yani iş katmanıdır.Persistance katmanından tek farkı veritabanı dışındaki operasyonları,işlemleri,servisleri yürüttüğümüz bir katman olmasıdır.

Email/sms gönderimi,notification,payment gibi operasyonları örnek verebiliriz.

En dış katman olduğu için herhangi bir katman tarafından bağlılık yoktur.

Presentation Katmanı;

Kullanıcının uygulama ile iletişime geçtiği katmandır.

Örnek olarak Web App,Console App,MVC,PHP,Web API,JAVA uygulaması olabilir.

Genel olarak Onion Architecture’ı 6 madde ile özetleyecek olursak;

Her katman sadece bir iç dairedeki katmana bağlımlılık göstermektedir.

Her katmanın kendisinden önceki merkeze yakın bir katmana bağlılık göstermesi temel ilkedir.

Bağlılık tek yönlüdür, içe doğrudur.

Herhangi bir katmanda yapılan değişiklik içe doğru bir bağlayıcılığı olmayacağı için merkeze doğru olan katmanları etkilemeyecektir.Ancak dıştaki katmanları etkileyecektir.

Geleneksel mimarinin aksine veri katmanı(Persistance) en iç katman olarak değil, en dış katman olarak belirlenmiştir. Bu sayede uygulamada verinin nereden geldiğinden bağımsız olarak geliştirme yapılabilmektedir.

Onion Architecture bir clean architecture pattern’dir.

Şimdi Onion Architecture ile geliştirilmiş bir uygulamanın proje yapısına bir göz gezdirelim.

Verimli olacağını düşündüğüm onion architecture yaklaşımı ile geliştirilmiş bazı github repolarını aşağıda sizinle paylaşıyorum.Ayrıca bu yaklaşım ile geliştirmekte olduğum projem tamamladığında reposunu buraya ekleyeceğim.

Son olarak bu yazımı yazarken kullandığım kaynakları da aşağıda sizinle paylaşıyorum.

--

--