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ıyı 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:
HogwartsController.cs dosyasının olduğu bir web api projesi.
hogwarts-bll:
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.
⭐️ 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.
Dockerfile 🐳
docker-compose.yml 🐳
Tüm projeyi tek komutla ayağa kaldırıp, gerekli ortamın hazırlanmasına yardımcı olan yer.
appsettings.json dosyasına Startup.cs’de yol gösterdiğimiz DbConnection’u tanımlayalım:
"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:
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.
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”