.Net Core ile Çok Katmanlı Mimari

Oluşturma Tarihi: 25.01.2024 01:05:00
Yazar: Beginnerdeveloper


Genellikle projenin durumuna göre değişkenlik göstermek koşuluyla minimum 3 katmanlı mimari oluşturuyoruz gerekçe durumuna göre katmanlarımız daha fazla olabilir. Örnek projemiz 4 katmanlıdır. katmanlı mimarinin asıl amacı projeyi böl parçala yönettir.
Repository Design Pattern:
Veritabanı sorumluluğunu üstlenen sınıfı tasarlarken sorgusal anlamda en az sayıda methotla
yüksek veri erişimi sağlayan bir tasarım desenidir.
UnitOfWork Design Pattern:
Bu design pattern veritabanına yapılacak olan işlemleri toplu bir şekilde tek bir transaction(bir veya birden fazla sql sorgusundan meydana gelen işlemler.)üzerinden yapabilmemize imkan tanır.
1- .CORE Katmanı
Core katmanı bizim en içteki ve en temel katmanımızdır. bu katmanda business(iş) kodlarımız bulunmaz. Bu katmanda projenin genelini ilgilendiren sınıflarımız olmalı. örneğin : Model(Entity),DTO(data transfer object, tüm katmanlarda kullanabileceğim nesnelerim) nesnelerimiz, Repository(DAL) interface, service interface, UnitOfWork interface, yani sözleşmelerimiz core katmanında olmalı. diğer katmanlar işlemlerini yaparken her zaman bu katmandaki sözleşmelere(interface) göre hareket etmeli.

2-  .Data Katmanı (DAL,DATA ACCESS LAYER)( Diğer adıyla Repository katmanı)(VERİTABANI İŞLEMLERİ VE BAĞLANTISI)
Context ve migration dosyalarım bulunmalı. Daha sonra seed lerimiz(default datalar istiyorsak eğer) bulunmalı.  core katmanındaki repository interface inin   implement eden class burada olmalı. UnitOfWork te burada implement olmalı.
3- .Entity Katmanı(BU KATMAN DATA İÇERİSİNDE OLABİLİR)
Bu katman data içerinde olabilir ancak  daha çok kod okunaklığı için oluşturulabilir. bu katmanımızda tablo ve kolonlarımız olmalı.
4- .SERVİCE Katmanı(Business)
Bu katmanda ise Mapping yapılacak ve core katmanındaki service interface implement edilecek. Validations kuralları burada belirlenecek ve exception(hata) işlemleride bu katmanda yapılmalı.
5- .UI Katmanı
Bu katmanda kullanıcılara sunulan arayüz katmanımızı oluşturup tasarlıyoruz.

PROJEYE BAŞLIYORUZ
Core Katmanı
Entities : İlk olarak core katmanımızı inşa ediyoruz. Entitiylerimizi oluşturacağız bu katmanda.(ENTİTY(veri tabanı tablo karşılığı))
Tablolarımızı oluşturuyoz ancak tüm tablolarda ortak olan entitylerimizi base olarak diğer tablolardan miras alacak şekilde oluşturmalıyız.
Örnek: Id , oluşturma tarihi, silme tarihi gibi kolonlarımız base entity sınıfında olmalı ve diğer tablolardan miras alınmalı.

IGenericRepository (Interface): Repository Design patterni burada kullanıyoruz. Temel crud işlemleri generic olarak tasarlıyoruz. Veri tabanına yaptığımız tüm temel sorgular burada olmalı. Best practice açısından eğer methodum asenkronsa sonuna Async eklemeyi unutmayalım.
Update ve remove da  neden async değil. Sebebi  EF Core da bunun bir karşılığı yok ,ki gerekte yok çünkü o classın sadece stateini değiştiriyor. en basit haliyle uzun bir işlem olmadığı için.



IService(Interface) : Service katmanımız için gerekli olan interfacemizi oluşturuyoruz. Peki ne işe yarayacak.
Bu katman business logic kodlarımın olduğu yerdir. Datayı aldıktan sonra datayla ilgili ekstra işlemlerim burada olacak. (Tabii burası interface burada sadece sözleşmemizi yazıyoruz😉 ).Api veya Web MVC uygulamalarım sadece service katmanıyla haberleşecek. Örnek verilecek olursa mapping, validations, exceptions gibi iş kodlarım burada uygulanacak.


IUnitOfWork(Interface) : Bu  design pattern veri tabanına yapılacak olan işlemleri toplu bir şekilde yapmamızı sağlayacaktır.  Örnek vermek gerekirse  2 ayrı tabloya ekleme işlemi yapılıyor ama eğer tablonun birinde eklenip diğerinde bir hata olduğunda eklenmezse bu büyük bir sorundur .En son verileri ya 2 tabloya da ekleyecek  ya da hiç eklemeyecek .

Repository Katmanı
Veritabanıyla ilgili işlemleri gerçekleştireceğimiz katmanımızdır. İlk olarak EF Core ile ilgili kütüphanelerimizi bu katmanda tanımlamalıyız.
İlk önce AppDbContext sınıfımızı oluşturuyoruz.

program.cs sınıfımızda veri tabanı için gerekli Service'leri ekliyoruz(örn: connection bağlantısı gibi.)

Entity Configuration
Bu ayarlarımızıda yapmamız gerekiyor örnek vermek gerekirse eğer product name alanını varchar(50) tutmak istiyorsak bunları EF Core'a bildirmeliyiz.


Bu kısmı kirletmemek adına içeriğini farklı bir classta yazalım. Configuration adında bir klasör oluşturduk ve category tablomuz için gerekli config. ayarlarını burada yapacağız.


Seed Data
Seed data veri tabanı oluşturulurken bazı kayıtların otomatik atılması işlemi(örn: yönetici paneli admin admin girişi için.) migration işleminde otomatik bu datalar oluşacak.

GenericRepository
Generic Repositoryin amacı temel crud operasyonlarını tüm entityler için geçerli kılıyoruz. IGenericRepository'de hangi methodlarımızın olması gerektiğini interface yapımıza belirttik burda ise içeriğini dolduruyoruz ama generic bir biçimde.

UnitOfWork
Sayfanın en başında gerekli açıklama yazıyor.

Service Katmanı
Bu katmanımızda core katmanındaki  IService interface'ini implement edeceğiz.Bu katmanımız tüm business kodlarımızı barındıracak. Mesela product nesnesine  özel olarak yapılan veri tabanı sorguları bu kısımda gerçekleşecek. product service olarak oluşturup gerekli sorgu kodumuzu yazıp  ve IService interface'inide implement edip product veri tabanı işlemleri için bu servisi kullanmalıyım.

DTOs
Dtolar direk entityleri değilde gerekli olan propertyleri cliente göndermek veya almak için oluşturduğumuz classlarımızdır.

AutoMapper
Bu kütüphane maplemek için kullanılır. Verileri aktarırken en basit tabiriyle amele gibi uğraşmak yerine bizim için bu kütüphane dto ile entitye dönüşüm gerçekleştirir.
Tabiki de Automapper kütüphanesini projeme dahil etmem gerekli.

Tabii bu arada servicelerimizi program.cs dosyamıza bağımlılık(injection) tanımlamalarını eklemeyi unutmamalıyız.

CustomResponseDto(API ler için kullanılır.)
Apilerde clientlar endpointleri kullanırken (ürün kaydetme,silme,güncelleme vs) bu endpointlerden geriye tek bir model dönmek için işlem başarılıda olsa başarısızda olsa tek bir class sayesinde tek bir model dönülür.(tek bir model dönmenin avantajı clientleri ve apiyi rahatlatacaktır.)

UI Katmanı
Bu katmanımızda artık verileri dışarıya aktaracağız. ilk önce Api katmanımızda Base Controller  oluşturalım. Bu sınıfımızı genel status code durumunu döndürmek için kullanacağız.
Daha sonra ürünlerin data işlemleri için ProductController  sınıfımızı oluşturuyoruz.