DDD Projelerindeki Katmanlar

Adem Catamak
3 min readNov 18, 2020

--

You can access the English version via this link.

Domain Driven Design yöntemi ile geliştirilen projelerde Presentation, Application, Domain ve Infrastructure adları ile tasvir edilen katmanları görmekteyiz. Bu katmanların sorumlulukları üzerinde duracağım ve örneklerle açıklamaya çalışacağım.

Photo by Ryan Fields on Unsplash

Kullanıcı oluşturma senaryosu üzerinden tüm katmanlarda yolculuk yapılacak ve katmanlar bu örnek üzerinden anlatılacaktır. Örnek kodların tamamına bu link üzerinden ulaşabilirsiniz.

Sunum Katmanı (Presentation Layer)

Bu katman dış sistemlerle etkileşimin sağlanacağı kısımdır. Bu katman bir insan, bir uygulama veya bir mesajın domainin üzerinde oluşturacağı etkilerin giriş kapısı olarak yer almaktadır. Talepler bu katmandan kabul edecek ve cevaplar bu katmanda şekillenerek kullanıcıya gösterilecektir.

Örnek projede görebileceğiniz gibi Controllers sınıfları aracılığıyla HTTP ve Consumer sınıfları aracılığıyla da AMQP protokolleri ile sistem dış dünyayı algılayabilmektedir.

HTTP ile gelen istek objesini Uygulama Katmanının kabul edeceği istek formatına çeviren ve uygulama katmanının verdiği cevabı kullanıcıya ileten bu katmana ait örnek kod parçası aşağıda yer almaktadır.

Uygulama Katmanı (Application Layer)

İş süreci kurgularının ele alındığı katmandır. Uygulamanın yetenekleri bu katmanda gözlemlenebilmektedir. Domaine bağlı varlıklar bu katmanda oluşturulur ve bu katman aracılığı ile güncellemeye maruz kalırlar. Kullanım senaryolarına bağlı olarak transaction yönetimi gibi kurgular bu katmanın içerisinde çözüme kavuşturulmaktadır. İş emirlerinin yerine getirilmesi ve domain olaylarına gösterilecek reaksiyonlar bu katmanda kodlanmaktadır. Bu duruma örnek olarak CreateUser tipindeki iş emrinin çözümlenmesine ait sürece ait kod parçası aşağıda yer almaktadır. Domain Katmanı içerisinde yer alan User tipindeki objeden oluşturulup bu objenin veri saklama ortamına saklanması ile kullanıcı oluşturulmasına yönelik talep çözüme ulaştırılmaktadır.

Bazen birden fazla domain objesinin etkilendiği süreçler de olabilir. Kullanıcıların, email adreslerine gönderilen doğrulama kodunu kullanarak hesaplarını onayladıkları bir süreci hayal edelim. Eposta Adresimi Onayla (VerifyEmailCommand) adında bir iş emrinin sistemde yer aldığını düşünelim. Bu talebin çözüm süreci “Kullanıcının email durumu onaylandı olarak işaretlenirken, Doğrulama Kodu da kullanıldı olarak işaretlenecektir.” şeklinde betimlenebilir. Bu tasvirden yola çıktığımız durumda iş emri yerine getirilirken bir transaction bloğu içerisinde birden fazla varlığın üzerinde değişiklik yapılacağını öngörebiliriz.

“… olurken, … olur” şeklinde tanımlanan süreçler, transactional bütünlük içerisinde ele alınmalıdır. Bu duruma ait senaryonun bir örneğini yukarıda gördük. Bir diğer durum senaryomuz ise “… olduktan sonra, … olur.” şeklindedir. Bu şekilde tanımlanan süreçlerde domain olaylarından (domain event) bahsedebiliriz. “Kullanıcı oluşturulduktan sonra entegrasyon mesajı yayınlanır.” iş sürecimizin entegrasyon mesajı yayınlama kısmı Kullanıcı Oluşturuldu domain olayı ile tetiklenir ve Kullanıcı Oluştur iş emri ile aynı transaction bloğu içerisinde ele alınır.

Domain Layer

Uygulamanın merkezi burası olacaktır. Çözülmek istenen soruna ait tüm iş kurallarının yer aldığı katmandır. Bu katman içerisinde varlıklar (entities), değer objeleri (value objects), domain varlıklarımız (aggregates), yaratıcı sınıflarımız (factories) ve arayüzler (interfaces) yer alacaktır. Bu katman olabildiğince bağımlılıklardan uzak tutulmalıdır. Diğer katmanları referans olarak almaması gerektiği gibi olabildiğince 3rd party kütüphaneler de eklenmemelidir.

Aşağıda User domain objesine ait bir kısım kod parçası görmekteyiz. Bu kod parçası içerisinde yer alan Create yaratıcı metodu DDD konsepti için önem arz eden işlemleri yerine getirmektedir. Bu yaratıcı metot aracılığıyla domaine ait iş kuralları çalıştırılmıştır. Bu sayede geçersiz bilgilerle tutarsız bir kullanıcı objesinin oluşturulmasının önüne geçilmiştir. Yaratıcı metot aracılığı ile domain içerisinde oluşmuş duruma ait mesajın -kullanıcı oluşturuldu- oluşturulması da sağlanmıştır.

Domain katmanında iş süreçlerinin simüle edilmesine odaklanılır. Bu katman verilerin saklanması konusuyla ilgilenmez (Persistance Ignorance). Buna karşın bu katman soyutlamaların yapıldığı katman olduğu için IUserRepository gibi kayıt işlemlerini yapacak arayüzlerin tasarımı domain katmanında yer almaktadır.

Altyapı Katmanı (Infrastructure Layer)

Bu katman veri tabanı, mesajlaşma sistemleri, email servisleri gibi dış servislere erişilen katman olacaktır. Domain katmanında tasarlanan, uygulama katmanında kullanılan IUserRepository arayüzü bu katmanda implemente edilerek bir kimliğe kavuşacaktır. Benzer şekilde IIntegrationMessageBroker arayüzü üzerinden kullanılan varlık bu katmanda bir implementasyona sahip olacaktır. Örnek bir seçenek olarak AMQP protokolü ile RabbitMq platformuna erişmek düşünülebilir.

Network ve dosya sistemi gibi dış dünyayla iletişime geçmek için yürütülecek kod parçaları bu katmanda yer alacaktır.

Örnek uygulamamızda projeler arasındaki referans ilişkisi yukarıdaki gibidir.

Domain Driven Design konseptinde sıkça adı geçen 4 katmandan ve bu katmanların sorumluluklarından bahsetmiş oldum. Umarım yararlı bir yazı olmuştur. Diğer yazılarıma göz atmak için bu linke tıklayabilirsiniz.

--

--