Skip to content

Bu proje, sadece API katmanına dayalı bir yapıdır ve katmanlı mimari prensiplerine göre geliştirilmiştir. İş mantığı servis katmanlarında yönetilir, DTO'lar kullanılarak veri transferi yapılır ve caching (önbellekleme) katmanı ile performans artırılır. Modüler ve sürdürülebilir bir yapı sunarak, hızlı ve verimli bir API sağlar.

License

Notifications You must be signed in to change notification settings

eypacr/AspNetAPI-MVC

Repository files navigation

AspNetAPI-MVC

Best Practise

1. main: mvc katmanı olmayan sadece api katmanlı versiyon
2. AspNETAPI-MVC: MVC Katmanının API katmanı ile entegre olduğu versiyon.
3. AspNETMVC: API katmanı olmadan MVC katmanın Service katmanıyla haberleştiği versiyon.

Http Method Tipi Seçimi

En yaygın kullanılan metotlar.

  1. GET: Data okuma için kullandığımız tiptir
  2. POST: Yeni bir nesne eklediğimizde kullandığımız tiptir.
  3. PUT: Bir nesne üzerinde güncelleme yapılacaksa kullandığımız tiptir.
  4. DELETE: Bir nesne silmek için kullandığımız tiptir.

Doğru API / Endpoint Yapısı

Method Doğru Yanlış
GET https://localhost:7264/api/products https://localhost:7264/api/getproducts
GET https://localhost:7264/api/products/3 https://localhost:7264/api/getproductnyid/10
POST https://localhost:7264/api/products https://localhost:7264/api/saveproduct
PUT https://localhost:7264/api/products https://localhost:7264/api/updateproduct
DELETE https://localhost:7264/api/products https://localhost:7264/api/deleteproduct

Doğru Http Cevap Durum Kodları

  • 100 - Information Responses : 100 ile başlıyan cevaplar bilgilendirici cevaplardır.
  • 200 - Successful Responses: 200 ile başlıyan kodlar yapılan isteğin başarılı olduğunu gösterir.
  • 300 - Redirect Messages: 300 ile başlıyanlar yönlendirme mesajlarını gösterir.
  • 400 - Client Error Responses: Client isteği hatalıysa 400 lü kodlar kullanılır.
  • 500 - Server Error Responses: Sunucumuzda bir hata oluştuğunda kullanılan hata kodlarıdır.

En Çok Kullanılan Durum Kodları:

  • 200 - Ok: Başarılı istek karşılığında geri dönülecek durum kodudur. Get metodu karşılığı dönülebilir. Get metotlarında kullanılabilir.
  • 201 - Created: Yeni bir nesne eklendiğinde geri dönen durum kodudur. Post metotlarında kullanılabilir.
  • 204 - NoContent: Eğer güncelleme veya silme işlemi varsa, yani PUT ve Delete metotlarının sonucunu dönmek için kullanılır.
  • 400 - BadRequest: Client tarafında hatalı bir istek yaptığında dönülecek durum kodudur. Örneğin gönderilen data format hatası karşılığında dönülecek durum kodudur. Response da da hata ile ilgili açıklamayı dönebiliriz.
  • 401 - Unauthorized : Client tarafında süresi bitmiş token gönderilmişse yada gönderilmemişse gibi durumlarda geri dönülen durum kodudur.
  • 403 - Forbid: Client tarafından gönderilen tokenın ilgili işleme yetkisi yoktsa geri dönülen durum kodudur.
  • 500 - InternalServerError: Suncuu tarafımızda oluşan hatalar için örneğin database bağlanma sorunu vs. gibi hatalarda geri dönülecek durum kodudur.

Doğru Endpoint URL Yapısı

Request İçerisinde Aynı Property'i Almaktan Kaçın

GET: https://localhost:7264/api/products/5

	    [HttpPut("{id}")]
        Public IActionResult Update(Product product, int id)
        {
    	    // Güncelleme İşlemleri
    	}

Buradaki gibi hem url den Id alıp, hemde Product nesnesinin içinde Id alınıyor. Bir parametreyi iki kere almış olunuyor. Bunun yerine alttaki yöntemle yazılabilir. GET: https://localhost:7264/api/products

 [HttpPut]
 Public IActionResult Update(Product product)
 {
	    //Güncelleme İşlemleri
 }

Asp.Net Core Uygulamasının program.cs Dosyasını Mümkün Olduğunca Sade Bırak

public void ConfigureServices(IServiceCollection services)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

Program.cs dosyamızdaki en önemli 2 metot olan ConfigureServices ve Configure mümkün olduğunca sade tutmak gerekir. Middleware ve Servicelerimizi birer Extension metot içerisine taşıyıp sadece metodu ilgili yerde çağırarak daha sade bir program.cs dosyası yapılandırmış olur.

Uygulamamızı mümkün olduğunca küçük parçalara böl

N Katmanlı mimari ile projeyi inşa etmek proje bazında parçalara bölmemizi sağlar. Yapacağımız uygulama küçük bir pojeyse ilerde büyüme olmayacaksa katmanlı mimari kullanmaya gerek yoktur. Örneğin ; MyApp.Web** => Web Uygulaması MyApp.API => API uygulaması MyApp.Core => ClassLibrary (Temel nesnelerimiz tutarız. ) MyApp.Data => ClassLibrary (Entity Framework işlmelerini içerir) MyApp.Service => ClassLibrary (Data katmanından gelen verileri api a ulaştırmak için) MyApp. Logging => ClassLibrary (Loglama ile ilgili işlemleri gerçekleştirdiğimiz katman)

Controller sınıflarınız mümkün oldukça temiz tutun. Business kodu bulundurmayın.

Controllerda yardımcı metotlar olmamalı. Sadece Action metotlar olmalı .

	[Route("api/[controller]")]
        [ApiController]
        public class ProductsController : ControllerBase
        {
            private readonly IProductService _productService;
            private readonly IMapper _mapper;
            public ProductsController(IProductService productService, IMapper mapper)
            {
                _productService = productService;
                _mapper = mapper;
            }

            [HttpGet]
            public async Task<IActionResult> GetAllProduct()
            {
                var products = await _productService.GetAll();
                return Ok(_mapper.Map<IEnumerable<ProductDto>>(products))
            }

            [ValidationFilter]
            [ServiceFilter(typeof(NotFoundFilter))]
            [HttpGet("{id}")]
            public async Task<IActionResult> GetProductById(int id)
            {
                var product = await _productService.GetById(id);
                return Ok(_mapper.Map<ProductDto>(product));
            }
        }

Action methodlarımızı mümkün oldukça temiz tutun. Business kodu bulundurmayın.

[HttpGet]
public async Task<IActionResult> GetAllProduct()
{
	var products = await _productService.GetAll();
	return Ok(_mapper.Map<IEnumerable<ProductDto>>(products))
}

Hataları global olarak ele alın. Action methodlar içerisinde try-catch blokları kullanmayın.

Tekrar eden kodlardan kurtulmak için filter kullan.

[ServiceFilter(typeof(NotFoundFilter))]
[HttpGet("{id}")]
public async Task<IActionResult> GetProductById(int id)
{
	///İşlemler
}

[ValidationFilter]
[HttpPost]
public async Task<IActionResult> Create(ProductDto product)
{
	//İşlemler
}

[ValidationFilter]
[HttpPost]
public async Task<IActionResult> Update(ProductDto product)
{
	//İşlemler
}
[ServiceFilter(typeof(NotFoundFilter))]

NotFoundFilter ile id üzerinde veritabanında bu id li product varmı kontrolünü sağlar.

 [ValidationFilter]

ValidationFilter ile clienttan gelen ProductDto modelinde hatalı veri varsa bunun kontrolünü yapmak için.

Action methodlardan direkt olarak model sınıflarınızı dönmeyin.

İlgili modellerin DTO(Data Transfer Object) sınıflarını dönün. Yani direk modeli dönmek yerine sadece clientın ihtiyacına özel bir dto dönmeliyiz. Modelimiz:

Public class Product {
	public int Id {get; set;}
	public string name {get; set;}
	public decimal Price {get; set;}
	public int Stock {get; set;}
	public int CategoryId {get; set;}
	public bool IsDeleted {get; set;}
	public string InnerBarkod {get; set;}
}

Clienta Dönülecek DTO :

Public class ProductDto {
	public int Id {get; set;}
	public string name {get; set;}
	public decimal Price {get; set;}
	public int Stock {get; set;}
	public int CategoryId {get; set;}	
}

AspNetAPI-MVC Proje Yapısı Örnek

  1. Core Katmanı : Model(Entity), DTOs, Repository Interfaces, Service Interfaces, UnitOfWork Interfaces
  2. Repository Katmanı: Migrations, Seeds, Repository Impl, UnitOfWork Impl ⇒ Reference Core Layer
  3. Service Katmanı: Mapping, Service Impl, Validations, Exceptions ⇒ Reference Repository Layer
  4. API : Reference Service Layer
  5. WEB : Reference Service Layer Or Use API

Separation of concern (SoC) (İlgili kod ilgili yerde bulunacak) prensibine uygun AspNetAPI-MVC proje yapısı.

About

Bu proje, sadece API katmanına dayalı bir yapıdır ve katmanlı mimari prensiplerine göre geliştirilmiştir. İş mantığı servis katmanlarında yönetilir, DTO'lar kullanılarak veri transferi yapılır ve caching (önbellekleme) katmanı ile performans artırılır. Modüler ve sürdürülebilir bir yapı sunarak, hızlı ve verimli bir API sağlar.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published