Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/eypacr/aspnetapi-mvc


https://github.com/eypacr/aspnetapi-mvc

Last synced: 13 days ago
JSON representation

Awesome Lists containing this project

README

        

# 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ı
- Get : https://localhost:7264/categories/3/products -- Doğru
- Get : https://localhost:7264/categories/3/products/5 --Hatalı parent-child ilişkilerinde bu şekilde yapılır olmamalıdır.
- Get: https://localhost:7264/products/3 -- Doğru

## Request İçerisinde Aynı Property'i Almaktan Kaçın
GET: https://localhost:7264/api/products/5
```csharp
[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
```csharp
[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ı .
```csharp
[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 GetAllProduct()
{
var products = await _productService.GetAll();
return Ok(_mapper.Map>(products))
}

[ValidationFilter]
[ServiceFilter(typeof(NotFoundFilter))]
[HttpGet("{id}")]
public async Task GetProductById(int id)
{
var product = await _productService.GetById(id);
return Ok(_mapper.Map(product));
}
}
```
## Action methodlarımızı mümkün oldukça temiz tutun. Business kodu bulundurmayın.
```csharp
[HttpGet]
public async Task GetAllProduct()
{
var products = await _productService.GetAll();
return Ok(_mapper.Map>(products))
}

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

## Tekrar eden kodlardan kurtulmak için filter kullan.

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

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

[ValidationFilter]
[HttpPost]
public async Task 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:**
```csharp
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 :**
```csharp
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
5. **API :** Reference Service Layer
6. **WEB :** Reference Service Layer Or Use API

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