Hogwarts Sınıflarını .NET Core + Postgres ile Oluşturmak ve Dockerize Etmek 🧙‍♂️

Onur Uzun
5 min readAug 29, 2021

1 Eylül gelmeden Hogwarts hazırlıkları başladı.

.NET Core ile yazılan Postgres ile desteklenen, ayrıca; Repository Pattern’i kullanarak: “ -ne gelirse gelsin farketmez, hallederiz! ” diye ortalıkta Dumbledore edasıyla gezinen, iskeleti bir kere kurduğunuzda dönüp bir daha bakmanız gerekmeyen Generic yapı da serpiştirip CRUD işlemler ile aynı Fawkes’ın Harry’e uçtuğu gibi requestleri proje içerisinde ordan oraya uçuracak, sonrasında da Durmstrang’ın havalı gelişi gibi olmasa da projeyi Dockerize ederek tek satır komutla tüm Hogwarts sınıflarını ayağa kalkmasını sağlayarak Hogwarts’u keyifle açacağız! 🧙‍♂️

Bu seneki Hogwarts eğitimleri teknoloji üzerine kuruldu: Profesörler sihirli zamazingolardan sıkılmış ve kendilerine özel olarak üretilen çeşitli boyutlardaki ekranlarından sınıfları takip edip, ekran karşısında Jam roly-poly’lerini afiyetle yemek istemişler. evet. Dersler de onlinemış.

ve bu seneki teknoloji içeriği ve yapılacaklar lisetesi de şu şekildeymiş;

Profesörler:

  • Hogwarts’ta bulunan tüm sınıfları listeleyebilir,
  • Tek bir sınıfı özel olarak listeleyebilir,
  • Denizin dibinden gelen veya gökyüzünden süzülerek gelecek olan bir okul olur da yeni bir sınıf eklemek isterler; yepyeni bir sınıf ekleyebilirler,
  • Yanlış mı ekledi? Sorun değil, güncelleyebilir,
  • Slytherin ceza mı aldı? silebilir. evet

Teknoloji Malzemeleri:

  • .NET Core,
  • PostgreSQL,
  • Docker,
  • Swagger,
  • AutoMapper,
  • EF Core,
  • Generic Design Pattern,
  • Repository Pattern,
  • Dependency Injection

Eveet, 9 3/4 treni kalkıyor 🚂

İlk önce projenin yapısından bahsetmek istiyorum.

hogwarts-api
hogwarts-bll
hogwarts-repository
hogwarts-test

olmak üzere 4 katmandan oluşuyor ve her katman takdir edersiniz ki; yaptığı iş bakımından birbirinden ayrılacak. Ortada birbirlerine referans vererek buluşacaklar.

bkz:
requestlerin karşılandığı katman (api),
iş akışlarının düzenlendiği katman (bll),
veritabanı işlemlerinin yapıldığı katman (repository),
vee… olmazsa olmazımız ama içi boş olan test katmanı. şimdilik.

Başlangıçta:

Proje klasörlerini, template’lerini oluşturmamız gerekir. Dilerseniz aşağıdaki gibi bir yapı kurabilirsiniz.

Projelerin referanslarını vermeyi unutmayınız! 🤓

cd [YOUR_PATH]/[YOUR_PROJECT_FOLDER]dotnet new slndotnet new webapi -o hogwarts-apidotnet new classlib -o hogwarts-blldotnet new classlib -o hogwarts-repositorydotnet new xunit -o hogwarts-test

hogwarts-api:

hogwarts-api folder

HogwartsController.cs dosyasının olduğu bir web api projesi.

HogwartsController.cs

hogwarts-bll:

hogwarts-bll folder

Enums: Belirli objelerin değerlerini tip olarak belirttiğimiz ve projenin belirli yerlerinde kullandığımız yapı Enum yapısı.

Mappings: Objeleleri entitylerimizden yani veritabanındaki birebir tablo kolonlarımızdan ayırdığımız yerlerde bize kolaylıklar sağlasın diye kullanmış olduğumuz bir kütüphane yapısı. İçeride kütüphanenin implemente edilmiş halini bulabilirsiniz. (Ayrıca Startup.cs’te de servis olarak eklenen ve singleton olarak işaretlenen birkaç ayarı var)

Models: Modelleme işlemlerinin döndüğü yer.
*Dto: Burada response döneceğimiz client’a nasıl bir yapıda dönmemiz gerektiğini söylediğimiz modelleme yapısı. Aslında; veritabanından çektiğimiz kolonları buradaki yapıya göre mapliyoruz ve istemediğimiz alanları client’a göndermiyoruz veya özetle; entity ile response modeli ayırıyoruz.

Operations: İş akışlarının döndüğü yer.

Utils: Genelde projenin sağında solunda kullanılacak şeyleri (enum, const, replacer, static şeyler, küçük extension methodları tanımladığımız yer. Yer yer değişiklik gösterebiliyor projeye göre. Buradaki görevi içerisinde Hogwarts’taki belli sınıflarının bir örnek datasını tutuyor. Projeyi ayağa kaldırdıktan sonra data eklemek için buradan kopyala yapıştır yapıp POST servisini kullanabilirsiniz.

IHogwartsOperation.cs
HogwartsOperation.cs

⭐️ hogwarts-repository:

hogwarts-repository

Generic: Repositoryler için ortak CRUD işlemleri için olan generic klasörü.
IRepository: TEntity; veritabanındaki tablolar. Ne tip gelirse gelsin ona göre CRUD işlemi yapacağını söylediğimiz yer.

Context: POCO migrationları için gerekli* olan klasör.

Models: Buraya yazılan modeller client tarafına dönmemeli, genelde business katmanında Dto yazılıp clienta o şekilde dönülüyor. Entity modelleri burada ham data olarak veritabanını maplemek için kullanılıyor.

IRepository.cs
GenericRepository.cs

Dockerfile 🐳

Dockerfile

docker-compose.yml 🐳

Tüm projeyi tek komutla ayağa kaldırıp, gerekli ortamın hazırlanmasına yardımcı olan yer.

docker-compose.yml

appsettings.json dosyasına Startup.cs’de yol gösterdiğimiz DbConnection’u tanımlayalım:

appsettigs.json
"ConnectionStrings": {"DbConnection": "User ID=postgres;Password=123456;Server=localhost;Port=5432;Database=hogwarts;Integrated Security=true;Pooling=true;"}

docker-compose.yml

Hazırladığımız docker-compose.yml dosyasını build alıp çalıştıralım.

İçerisinde; postgre, pgadmin, ve yazdığımız api projesi var. Bunların imagelarını oluşturup containerları ayağa kaldıracak.

docker-compose build
docker-compose up -d

-d : arka planda çalışsın

Eğer masaüstü uygulamasını kullanıyorsanız şu şekilde bir şey görmeniz gerekiyor:

docker-compose sonrası ayaktaki containerlar

pgadmin: http://localhost:5050/

hogwarts_api: http://localhost:1907/swagger/index.html

PostgreSQL:

Migration:

cd /hogwarts/hogwarts-apidotnet ef migrations add hogwartsmigrationdotnet ef database update hogwartsmigration

Bu komutlar sonrasında api projesinin içerisine Migrations diye bir klasör açılacak ve içerik aşağı yukarı şu şekilde olursa mis:

Migrations klasörünü update komutundan sonra eğer başarılı bir şekilde tamamlanırsa (done.) silebilirsiniz. Tamamlanmazsa da silebilirsiniz, kalabalık yapmasın.

Migration sonrası şu görsele sahipseniz tadından yenmez.

…evet evet Jam roly-poly’ler.

Sonraki adım: Swagger üzerinden Hogwarts’a o güzelim sınıfları eklemek için kolları sıvamak.

https://localhost:1907/swagger/index.html

Projenin kodlarına buradan ulaşabilirsiniz.

🧙‍♀️ 🧙‍♀️

Sınıflar oluşturuldu mu?

Oluşturulduysa, söz Seçmen Şapka’da:

Bu şapka, dersiniz, çirkin mi çirkin!
Ama öyle hemen karar vermeyin.
Toz olurum varsa benden güzeli,
Eşsizim kendimi bildim bileli.
Ne kasket dinlerin ne de silindir,
Şampiyonluk kaçmaz, hep bana gelir.
Hogwarts okulunda Seçmen Şapka’yım,
Her gün, her ay, her yıl başka başkayım.
Karşımda şöyle bir ürperin biraz
Dünyada hiçbir şey gözümden kaçmaz.
Eğer geçirirsen beni başına
Gideceğin yeri söylerim sana.
Seni Gryffindor’a yollarım belki,
Zamanla olursun aslanın teki,
Yiğittir orada kalan çocuklar,
Hepsinin yüreği, nah, mangal kadar.
Belki de düşersin Hufflepuff’a
Haksızlığı hemen kaldırıp rafa
Adalet uğruna savaş verirsin
Her yere mutluluk götürmek için.
Ravenclaw kısmetin belki,
Oradakilerin hiç çıkmaz sesi,
Mantıktır onlarca önemli olan,
Öyle kurtulurlar tüm sorunlardan.
Düşersin belki de Slytherin’e sen,
Bir başkadır sanki oraya giden,
Amaçları için neler yapmazlar
Açıklasam bitmez sabaha kadar.
Giy kafana beni! Çekinme sakın!
Birinci koşul bu: Korkmayacaksın!
Hiç kimseye gelmez kötülük benden,
Şapkalar içinde en uysalım ben.

Güzel bir dünya dileğiyle, sevgiler 🙏

“Draco Dormiens Nunquam Titillandus”

--

--