Loading ...

icon
...Muhammet Ali Çomak
25 Ocak 2024

.Net Core ile Çok Katmanlı Mimari

Herkese merhaba bu blogta .NET için basit bir katmanlı mimari yapısı oluşturacağız.

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)

Bu katmanda ise context ve migration dosyaları 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.

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

Image

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.

Image

IService(Interface): Service katmanımız için gerekli olan interfacemizi oluşturuyoruz. Peki ne işe yarayacak.

Bu katman business logic kodlarının olduğu yerdir. Datayı aldıktan sonra datayla ilgili ekstra işlemler burada olacak. (Tabii burası interface burada sadece sözleşmemizi yazıyoruz😉 ).Api veya Web MVC uygulamaları sadece service katmanıyla haberleşecek. Örnek verilecek olursa mapping, validations, exceptions gibi iş kodları burada uygulanacak.

Image

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 .

Image

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.

Image

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

Image

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.

Image

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.

ImageImageImage

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.

Image

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.

Image

UnitOfWork

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

Image

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.

Image

DTOs

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

Image

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 projeye dahil etmem gerekli.

Image

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

Image

CustomResponseDto(API ler için kullanılır.)

Apiler de 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.)

Image

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.

Image

Daha sonra ürünlerin data işlemleri için ProductController sınıfımızı oluşturuyoruz.

Image

Böylelikle basit bir şekilde katmanları oluşturup projeyi çalışır hale getirmiş olduk.

Daha fazlası için