Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/eypacr/aspnetapi-mvc
https://github.com/eypacr/aspnetapi-mvc
Last synced: 13 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/eypacr/aspnetapi-mvc
- Owner: eypacr
- License: mit
- Created: 2024-09-07T20:33:15.000Z (4 months ago)
- Default Branch: master
- Last Pushed: 2024-09-07T20:35:22.000Z (4 months ago)
- Last Synced: 2024-09-07T21:40:06.659Z (4 months ago)
- Language: C#
- Size: 1010 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
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/getproductsGET
https://localhost:7264/api/products/3
https://localhost:7264/api/getproductnyid/10POST
https://localhost:7264/api/products
https://localhost:7264/api/saveproductPUT
https://localhost:7264/api/products
https://localhost:7264/api/updateproductDELETE
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ırakpublic 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ı Örnek1. **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 APISeparation of concern (SoC) (İlgili kod ilgili yerde bulunacak) prensibine uygun AspNetAPI-MVC proje yapısı.