Selamlar, nasıl sormam gerektiğini tam emin olamadım. Şöyle ki rest servis yazmaya çalışıyorum.
Örnekleri incelediğimde model – service-controller-repository kısımları oluyor, business lojik bazen repository olmadan direkt sevis katmanında
bazen de repository değil de direkt repository üzerinden kuruyor. Bunu yaparken nasıl bir mimari kuruyoruz hakim olan var mı?
Umarım anlatabilmişimdir 🙂
Birçok sorunun cevabı gibi bu da tamamen senin nasıl bir yapı kurmayı istediğine göre değişir. Çok basit uygulama yapacağını düşünürsek sadece elinde controller yapıp herşeyi buna gömebilirsin. Pek tavsiye edilen birşey değildir ama mümkün. Ben birçok örneğini gördüm.
Biraz aşama aşama ilerleyelim.
Mesela kullanıcıdan iki adet bilgi alacaksın bunlar üzerinde bir hesaplama yapıp döneceksin. Db, web servis, dosya vs. erişimine ihtiyacın yok. Bunu pek tabii controller üzerinden dönebilirsin. Bunun için servis katmanı yazmak ister misin tamamen sana ait.
Dersen ki ben herşeyi tek bir sınıf içine gömer yazar geçerim. Projenin çalışmasında bir sıkıntı çıkmaz. Ama Pek de istenmez. İstenmemesinin sebebi; yazılım projelerinin ömrünün %90 dan fazlası bakım (maintenance/support) zamanında geçmesidir. Tek bir sınıf içine herşeyi gömersen sınıf büyüdükçe ve işler karmaşıklaştıkça bakım için harcadığın süre artacaktır. Yani bir hata geldi ve düzeltmen gerekiyor sınıfın da 10.000 satırlık kod (ben 7000 satıra denk gelmiştim.) bakarken kör olabilirsin 🙂 Peki nasıl ilerlemek gerekir? Yazdığın kodu faz faz değerlendirirsen bu ilk faz olur ve bu yapın sanıyorum 1-tier-architecture (1-katmanlı-mimari) olur. Yani yeni öğreniyorsun herşeyi bir sınıfa/controllera yazıp geçiyorsun. Zamanla öğrendikçe ikinci faza geçeceksin.
Ta da al sana ikinci katman. Devam ederken konunun anlaşılması için bir de db ekledim. Şimdi 2-tier-architecture yapısına doğru devam eder olduk. Artık dedin ki ben controller içinde benim db bağlantısı, dosya işlemleri varsa mesaj kuyruklarına bağlantılar ve işlemlerini yapmayayım. Kontroller dışarıdan isteği alan ve gerekli işleri yapacak servisleri çağıran bir yapı olarak dursun. Karmaşık işleri yavaş yavaş service katmanı altına çekeyim. Güzel. Artık yabancıların değişiyle biraz daha wise (bilge) bir yapıya doğru evrilmeye başladık. Bu iş görür mü peki? Bence birincisi de görürdü. Amacımız olduğumuzdan biraz daha iyiye gitmek işlemleri biraz daha anlaşılabilir parçalara bölmek. 2-katman-mimari güzel bence. Ama dedik ki bağlantı işleri service katmanı içinde çok fazla yer kaplıyor (kod miktarı) bunu da ayıralım. Yani veriyi biz veri tabanında tutuyorsak o işlemleri yapan katmanı da ayıralım.
Durmuyordu!! Bir katman daha ekledik. Artık kullanıcıdan bilgilerin alındığı katmanımız var Controller, aldığımız bilgiyi yapacağımız işlemlere göre pasladığımız bir katmanımız var Service, bilgilerin veri tutulması ile alakalı işlemlerini yapan bir katmanımız var Repository (persistence katmanı da deniyor). Çoğu proje için burası artık olgunluk yeridir. Derinlemesine daha katman eklemene gerek olmaz. Tabi burda da artık yetmeyecek duruma gelebilir, herhalde 🙂
Yani tipik olarak 3-katmanlı-mimari çoğu isteği karşılar.
Eğer Rest değil de kullanıcı ile bilgi alış-verişini sağlayacak bir uygulaman olsaydı actor – controller arasında bir de presentation katmanın olurdu.
İşler için kullandığın sınıflar (model sınıfları ile entity sınıfları, bkz MVC) ile kullanıcıyla arandaki iletişimi sağladığın sınıflar arasında bir fark varsa bunların birbirine dönüştüldüğü mapping katmanı da eklenebilirdi.
Eğer asenkton db kaydı ya da asenktron email atılması gibi işlemlerin olacaksa tasarımına bağlı bir Messaging (Mesaj kuyrukları için) ihtiyacın da olabilirdi.
Vs. vs. Yani senin ne kadar ihtiyacın varsa o kadar katman ekleyebilirsin. Bu yaklaşıma da n-tier-arctihecture (n-katmanlı-mimari) deniyor. Genellikle 3-tier-architecture yeterli. Eğer ben daha yeniyim dersen 1-tier ile başlayabilirsin. Teorik olarak hepsi ihtiyaçlarını görür.
DİPNOT: Bu yapı tek uygulama için, yani servis-based bir yapı kullanıyorsan, mesela mikroservis, herbir servisin için bu yapının tekrarlanması gerekir. Yani elinde bir kullanıcı servisin, muhasebe servisin ve kargo takip servisin var. Bunların her biri için n-tier yapman gerekir.
İyi çalışmalar.
çok güzel bir açıklama olmuş kalemine sağlık abi 🙂