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

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

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.
https://github.com/eypacr/aspnetapi-mvc

aspnetcorewebapi csharp dtos ntier-architecture repository-pattern rest-api restful-api unitofwork-pattern visual-studio

Last synced: 29 days ago
JSON representation

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.

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ı.