Net Core Onion Architecture Implementation

Mevlüt Gür
3 min readJun 13, 2022

Merhaba arkadaşlar,

Öncelikle burada yazmış olduğum bilgiler Salih Cantekin`e aittir. Kendisinin You Tube videosu üzerinden bu mimariyi uygularken aynı zamanda bir doküman oluşturmak istediğim için bu yazıyı yazıyorum.

Onion arhitecture`ın ne olduğuna ve neden kullanıldığına dair makaleler okuduğunuz varsayaraktan proje oluşturma aşamasına geçiyorum.

Onion Architecture

Denex geliştirilmek istenilen projenin ismidir. İlk olarak Denex.BackEnd adlı solution oluşturuyoruz. Bu solutuion altında src adlı klasörü oluşturuyoruz.

1-Domain Layer

Bu katmanı oluşturmak için için önce src klasörü altında Core adlı klasörü oluşturuyoruz. Core klasörü altında Denex.Domain adlı class library projesi oluşturuyoruz. Domain class library içerisinde;

İlk olarak Common adlı klasör altında domain katmanına ait ortak ögerleri bulunduruyoruz. Örnek olarak BaseEntity adlı class ekliyoruz. Bu class tüm entity`lerimizde ortak olan field`ları içerecektir.

Entities adlı klasör altında projede kullanacağımız entity`leri bulunduruyoruz. Burada örnek olması amacıyla Product entity oluşturuyoruz.

Solution Explorer

2- Application Layer

Denex.Application adlı class library`i src\Core klasörü altına ekliyoruz. Application class library içerisinde;

Dto adlı klasörümüzün altında data transfer objelerini bulunduruyoruz. Örnek olarak ProductViewDto oluşturuyoruz.

Dto, entity`lerimizi dış dünyaya sunarken kullanacağımız modellerdir. Örnek olarak ProductViewDto class`ı oluşturuyoruz. Bu class Product entity de olan Id ve Name field`larını içermektedir. Yani biz Product entity`nin field`larının bir kısmını dışarıya sunmuş oluyoruz.

Exceptions adlı klasör altında custom exceptionlarımızı bulunduruyoruz. Örnek olarak ValidationException oluşturuyoruz.

Mapping adlı klasörü altında map işlemlerini bulunduruyoruz. Automapper paketi eklendiğimiz zaman burayı kullanacağız.

Wrappers adlı klasörümüz altında servis response modellerimizi bulunduruyoruz. Örnek olarak BaseResponse (Response başarı durumu ve mesajını içerir) ve PagedResponse (Response döndürülürken pagination yapısı kullanabiliriz) oluşturuyoruz.

Interfaces adlı klasör altında interface`lerimizi bulunduruyoruz. Örneğin Reposiyory adlı klasör oluşturup altında IGenericRepository ve IProductRepository oluşturuyoruz.

Parameters adlı klasör altında request`lere ait modelleri bulunduruyoruz. Örnek olarak RequestParameter oluşturuyoruz.

Solution Explorer

3- Persistance Layer

src klasörü altında Infrastructure klasörünü oluşturuyoruz. Bu klasör projemizin dış dünyaya açılan kapısıdır. Örneğin harici bir servise erişme işleminde yada veri tabanı ile ilgili (Persistance) işlemler buradan yürütülür.

İlk olarak Persistance class library oluşturuyoruz. Bu class library`e Entity FrameworkCore ve EFCoreTools paketlerini ekliyoruz.

Context adlı klasör altında ApplicationDbContext adlı context`i oluşturuyoruz.

Repositories adlı klasör altında Application.Interfaces.Repository altında tanımlamış olduğumuz interface`lerin uygulamalarını burada yapıyoruz. Örnek olarak GenericRepository ve ProductRepository oluşturuyoruz.

Solution Explorer

4- WebApi Layer

src klasörü altında WebApi klasörünü oluşturuyoruz. Bu klasör onion arhitecture üzerinde presentation temsil etmektedir.

Bu katmanda Denex.WebApi adlı bir Web Api projesi oluşturuyoruz. Örnek olarak ProductController`ı oluşturuyoruz.

Ayrıca Infrastructure.Persistance altında ServiceRegistration adlı bir class oluşturuyoruz. Bu sınıf sayesinde ApplicationDbContext ve ProductRepository`nin registration (DI) işlemlerini yapıyoruz.

Solution Explorer

Sonuç Olarak

ProductController üzerinden request`lerimizi yürütebileceğimiz bir proje oluşturduk. Fakat ProductRepository`i inceleyecek olursak GenericRepository`den miras alındığından dolayı Product entity`yi zorunlu kılmaktadır. Fakat biz bunları Dto (ProductViewDto) üzerinden yürütmek istiyoruz. Bunun için CQRS ile birlikte MediatR patern`i projeye implement etmemiz gerekmektedir.

--

--