/blog-api

.Net Core 3.1 Web Api design versioning, Jwt bearer authentication, swagger documentation, serilog logger, EF Core Repository pattern, Db Migration, docker, xUnit Tests, dependency injection and project layers

Primary LanguageC#

.Net Core 3.1 Web API Design (Blog API)

Kullanılan Teknolojiler ve Yapısı

  • .Net Core 3.1 Web Api
  • versioning
  • Jwt bearer authentication
  • swagger documentation
  • serilog logger
  • EF Core
  • Repository pattern
  • Db Migration
  • Mssql
  • xUnit Tests
  • dependency injection
  • docker
  • project layers

Kurulum (Installation)

Projeyi çalıştırabilmek için ;
.NET Core 3.1 SDK
Windows | Linux | MacOS
Docker Kurulum için ve Docker SDK
.NET Core SDK Detay için

DB Scriptleri(Migration)

Ben mssql localdb kullandım;

İsteğe bağlı DbContextFactory.cs da düzeltme yapılabilir var connectionString =""; alanına veritabanın connectionString yazın

projenin .....\Blog\src\Libraries\Blog.Data yolunda command line açın (eğer entity'lerde değişiklik yapmadıysanız dotnet ef database update komutu çalıştırmanız yeterli olacaktır.)

#restore Blog.Data project
...Blog.Data_> dotnet restore #eğer entity'lerde değişiklik yaptıysanız

#build Blog.Data project
...Blog.Data_> dotnet build #eğer entity'lerde değişiklik yaptıysanız

#add Initial name migrations 
...Blog.Data_> dotnet ef migrations add [Initial | {chege'in ismi yazın}] #eğer entity'lerde değişiklik yaptıysanız

#Update migrations on database
...Blog.Data_> dotnet ef database update
#dotnet ef database update Initial

appsettings.json da "DefaultConnection": "..." alanına veritabanın connectionString yazın

 "ConnectionStrings": {
    "DefaultConnection": "..."
  },

Soru - Açıklama:

  • Projede kullanılan tasarım desenleri ve neden kullanıldı?

    • Domain Driven Design (DDD): Proje bittiğinde sürekliliğini sağlamak ve problemleri çözmek için; Yazılımcıların Domain uzmanları ile aynı dili konuşması kavramlar tüm ekip için aynı şey ifade etmeli. Komplex bir domain de sub domainlere ayırmak. Entity, kendine ait bir kimliğe sahip olması. Value object, temel tipler, mapleme, list, diziler vs. Aggregate Root, birbiri ile ilişkili entityler ya da bir iş kuralı bir arada kullanılması. Repository, bir aggregate içindeki Entity ve value objectlerin taşıdığı bilgilerin veri tabanına işlemesi kavramıdır ve AR kendi içinde transactinal yapıda gerçekleştirir. Katmanlı mimari, Domain, Application, Presentaion ve infrastructure katmanları. Refactoring, yeni özeliklerle birlikte ileştirmek. Temiz ve okunabilir kod.
    • Test Driven Development (TDD): Tasarla-> Test yaz-> Testin sonucu başarısız-> kodla-> Test sonucu başarılı; bir koda parçasının bir tek case için gerçekleştirilir. Başta maliyeti büyük olur proje sonlarına doğru çok verimli olmaya başlar ve yeni istekler geldikçe daha hızlı geliştirme yapılır buglar yakalanır. “Refactoring” ön plana çıkar.
    • Dependency inversion(D)- Abstractions (Information Hiding)- Inversion of Control (IoC)- Dependency Injection(DI): (D)Bağımlılıkların tersine çevirmek, somut kavram bağımlıkları soyut kavram bağımlılıkları yönüne çevirmek. (A)Bağımlılıklara detaylara değil genellemelere bağlı olmalı bunu interface’lerle yapmak mümkün bu sayede detaylardan soyutlanmış oluyor. (IoC) Kotta ki bağımlıklarımızı azaltmak için objelerin yaratılacağı zaman kontrolün bir framework geçmesi. (DI) Bağımlılıkları dışardan enjekte ederek çalışmasına devam eder.
    • Repository Pattern: Veri tabanında bir tablo için yapılan CRUD(Create-Read-Update-Delete) işlemleri; Generic bir yapıda her tablo için aynı işlemleri gerçekleştirebilen tasarımdır. Kod tekrarı ortada kaldırılmış olur ve aynı zaman da veri tabanına erişim tek yerde yönetimini sağlamış olur.
  • Daha önce ki tecrübelerimden kullandığım teknoloji ve kütüphaneler ...

    • Daha önce böyle bir wep api yazdım yapı olara aynıydı;
    • .Net Core 2.2 Web Api
    • api versiyonlama yapıldı(versioning)
    • Jwt kütüphanesi kullanıldı(Jwt bearer authentication),
    • swagger kütüphanesi api dökümantasyon için kullanıldı(swagger documentation)
    • serilog kütüphanesi loglama için kullnıldı(serilog logger)
    • Entity Framework Core kullanıldı (EF Core)
    • Repository pattern kullanıldı
    • Microsoft.VisualStudio.Web.CodeGeneration.Tools db scriptleri için kullanıldı(Db Migration)
    • Birim testler için xUnit kullanıdı(xUnit Tests)
    • .net core ' nin yapısında gelen "Microsoft.Extensions.DependencyInjection.Abstractions" dependency injection için kullanıldı (dependency injection)
    • Katmanlı mimari uygulandı(project layers)
  • Daha geniş vaktim olsaydı projeye neler eklerdim?

    • Audit yapısı kurardım.
    • Bir web projeside "vue js" veye "react" front-end frameworklerden birini kullanarak api entegrasyonunu yapardım.
  • Ek olarak ...

    • Docker konfigrasyonu yapıldı ve docker'dan deployment edilebilir. PC'nide Docker kuruluysa proje solutionına klasöründe command line docker-compose -f docker-compose.yml -f docker-compose.override.yml up --build komutu yazmanız yeterlidir. Docker'da testteleri çalıştırmak için de docker-compose -f docker-compose-tests.yml -f docker-compose-tests.override.yml up --build komutu çalıştırmanız yeterli olacaktır.