{"id":22838687,"url":"https://github.com/eypacr/aspnetapi-mvc","last_synced_at":"2025-10-25T02:39:42.433Z","repository":{"id":255921463,"uuid":"853892717","full_name":"eypacr/AspNetAPI-MVC","owner":"eypacr","description":"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.","archived":false,"fork":false,"pushed_at":"2024-09-07T20:35:22.000Z","size":1032,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-06T08:32:36.678Z","etag":null,"topics":["aspnetcorewebapi","csharp","dtos","ntier-architecture","repository-pattern","rest-api","restful-api","unitofwork-pattern","visual-studio"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eypacr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-07T20:33:15.000Z","updated_at":"2024-11-23T12:26:23.000Z","dependencies_parsed_at":"2024-09-07T21:40:12.682Z","dependency_job_id":"07780969-24f4-4016-9b2a-b307aff78dd1","html_url":"https://github.com/eypacr/AspNetAPI-MVC","commit_stats":null,"previous_names":["eypacr/aspnetapi-mvc"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eypacr%2FAspNetAPI-MVC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eypacr%2FAspNetAPI-MVC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eypacr%2FAspNetAPI-MVC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eypacr%2FAspNetAPI-MVC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eypacr","download_url":"https://codeload.github.com/eypacr/AspNetAPI-MVC/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246413244,"owners_count":20773053,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aspnetcorewebapi","csharp","dtos","ntier-architecture","repository-pattern","rest-api","restful-api","unitofwork-pattern","visual-studio"],"created_at":"2024-12-13T00:08:01.248Z","updated_at":"2025-10-25T02:39:37.402Z","avatar_url":"https://github.com/eypacr.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AspNetAPI-MVC\n   # Best Practise \n \t1. main: mvc katmanı olmayan sadece api katmanlı versiyon\n    2. AspNETAPI-MVC: MVC Katmanının API katmanı ile entegre olduğu versiyon.\n \t3. AspNETMVC: API katmanı olmadan MVC katmanın Service katmanıyla haberleştiği versiyon.\n\n   ## Http Method Tipi Seçimi\n  En yaygın kullanılan metotlar.\n  1. GET: Data okuma için kullandığımız tiptir\n  2. POST: Yeni bir nesne eklediğimizde kullandığımız tiptir.\n  3. PUT: Bir nesne üzerinde güncelleme yapılacaksa kullandığımız tiptir.\n  4. DELETE: Bir nesne silmek için kullandığımız tiptir.\n\n## Doğru API / Endpoint Yapısı\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003eDoğru\u003c/th\u003e\n\u003cth\u003eYanlış\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbdoy\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/products\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/getproducts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/products/3\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/getproductnyid/10\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePOST\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/products\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/saveproduct\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePUT\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/products\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/updateproduct\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDELETE\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/products\u003c/td\u003e\n\u003ctd\u003ehttps://localhost:7264/api/deleteproduct\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbdoy\u003e\n\u003c/table\u003e\n\n## Doğru Http Cevap Durum Kodları\n\n - **100 - Information Responses :** 100 ile başlıyan cevaplar bilgilendirici cevaplardır.\n - **200 - Successful Responses:** 200 ile başlıyan kodlar yapılan isteğin başarılı olduğunu gösterir.\n - **300 - Redirect Messages:** 300 ile başlıyanlar yönlendirme mesajlarını gösterir.\n - **400 - Client Error Responses:** Client isteği hatalıysa 400 lü kodlar kullanılır.\n - **500 - Server Error Responses:** Sunucumuzda bir hata oluştuğunda kullanılan hata kodlarıdır.\n \n**En Çok Kullanılan Durum Kodları:** \n - **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.\n - **201 - Created:** Yeni bir nesne eklendiğinde geri dönen durum kodudur. Post metotlarında kullanılabilir.\n - **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.\n - **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.\n - **401 - Unauthorized :** Client tarafında süresi bitmiş token gönderilmişse yada gönderilmemişse gibi durumlarda geri dönülen durum kodudur.\n - **403 - Forbid:** Client tarafından gönderilen tokenın ilgili işleme yetkisi yoktsa geri dönülen durum kodudur.\n - **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.\n\n## Doğru Endpoint URL Yapısı\n - Get : https://localhost:7264/categories/3/products -- Doğru \n - Get : https://localhost:7264/categories/3/products/5 --Hatalı parent-child ilişkilerinde bu şekilde yapılır olmamalıdır.\n - Get: https://localhost:7264/products/3 -- Doğru\n\n ## Request İçerisinde Aynı Property'i Almaktan Kaçın\nGET:    https://localhost:7264/api/products/5\n```csharp\n\t    [HttpPut(\"{id}\")]\n        Public IActionResult Update(Product product, int id)\n        {\n    \t    // Güncelleme İşlemleri\n    \t}\n```\nBuradaki 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.\nGET: https://localhost:7264/api/products\n```csharp\n [HttpPut]\n Public IActionResult Update(Product product)\n {\n\t    //Güncelleme İşlemleri\n }\n ```\n ## Asp.Net Core Uygulamasının program.cs Dosyasını Mümkün Olduğunca Sade Bırak\n\n    public void ConfigureServices(IServiceCollection services)\n    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\nProgram.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.\n\n## Uygulamamızı mümkün olduğunca küçük parçalara böl\nN 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.\nÖrneğin ;\nMyApp.Web**       \t=\u003e Web Uygulaması\n**MyApp.API** \t\t\t=\u003e API uygulaması\n**MyApp.Core** \t\t\t=\u003e ClassLibrary (Temel nesnelerimiz tutarız. )\n**MyApp.Data** \t\t\t=\u003e ClassLibrary (Entity Framework işlmelerini içerir)\n**MyApp.Service** \t\t=\u003e ClassLibrary (Data katmanından gelen verileri api a ulaştırmak için)\n**MyApp. Logging** \t=\u003e ClassLibrary (Loglama ile ilgili işlemleri gerçekleştirdiğimiz katman)\n\n## Controller sınıflarınız mümkün oldukça temiz tutun. Business kodu bulundurmayın.\nControllerda yardımcı metotlar olmamalı. Sadece Action metotlar olmalı . \n```csharp\n\t[Route(\"api/[controller]\")]\n        [ApiController]\n        public class ProductsController : ControllerBase\n        {\n            private readonly IProductService _productService;\n            private readonly IMapper _mapper;\n            public ProductsController(IProductService productService, IMapper mapper)\n            {\n                _productService = productService;\n                _mapper = mapper;\n            }\n\n            [HttpGet]\n            public async Task\u003cIActionResult\u003e GetAllProduct()\n            {\n                var products = await _productService.GetAll();\n                return Ok(_mapper.Map\u003cIEnumerable\u003cProductDto\u003e\u003e(products))\n            }\n\n            [ValidationFilter]\n            [ServiceFilter(typeof(NotFoundFilter))]\n            [HttpGet(\"{id}\")]\n            public async Task\u003cIActionResult\u003e GetProductById(int id)\n            {\n                var product = await _productService.GetById(id);\n                return Ok(_mapper.Map\u003cProductDto\u003e(product));\n            }\n        }\n```\n## Action methodlarımızı mümkün oldukça temiz tutun. Business kodu bulundurmayın.\n```csharp\n[HttpGet]\npublic async Task\u003cIActionResult\u003e GetAllProduct()\n{\n\tvar products = await _productService.GetAll();\n\treturn Ok(_mapper.Map\u003cIEnumerable\u003cProductDto\u003e\u003e(products))\n}\n\n```\n## Hataları global olarak ele alın. Action methodlar içerisinde try-catch blokları kullanmayın.\n\n## Tekrar eden kodlardan kurtulmak için filter kullan.\n\n\n```csharp\n[ServiceFilter(typeof(NotFoundFilter))]\n[HttpGet(\"{id}\")]\npublic async Task\u003cIActionResult\u003e GetProductById(int id)\n{\n\t///İşlemler\n}\n\n[ValidationFilter]\n[HttpPost]\npublic async Task\u003cIActionResult\u003e Create(ProductDto product)\n{\n\t//İşlemler\n}\n\n[ValidationFilter]\n[HttpPost]\npublic async Task\u003cIActionResult\u003e Update(ProductDto product)\n{\n\t//İşlemler\n}\n`````\n\n\n    [ServiceFilter(typeof(NotFoundFilter))]\n   \nNotFoundFilter ile id üzerinde veritabanında bu id li product varmı kontrolünü sağlar.\n\n     [ValidationFilter]\nValidationFilter ile  clienttan gelen ProductDto modelinde hatalı veri varsa bunun kontrolünü yapmak için.\n\n## Action methodlardan direkt olarak model sınıflarınızı dönmeyin.\n\nİ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.\n**Modelimiz:**\n```csharp\nPublic class Product {\n\tpublic int Id {get; set;}\n\tpublic string name {get; set;}\n\tpublic decimal Price {get; set;}\n\tpublic int Stock {get; set;}\n\tpublic int CategoryId {get; set;}\n\tpublic bool IsDeleted {get; set;}\n\tpublic string InnerBarkod {get; set;}\n}\n````\n**Clienta Dönülecek DTO :**\n```csharp\nPublic class ProductDto {\n\tpublic int Id {get; set;}\n\tpublic string name {get; set;}\n\tpublic decimal Price {get; set;}\n\tpublic int Stock {get; set;}\n\tpublic int CategoryId {get; set;}\t\n}\n````\n## AspNetAPI-MVC Proje Yapısı Örnek\n\n 1. **Core Katmanı :** Model(Entity), DTOs, Repository Interfaces, Service Interfaces, UnitOfWork Interfaces\n 2. **Repository Katmanı:**  Migrations, Seeds, Repository Impl, UnitOfWork Impl ⇒ Reference Core Layer\n 3. **Service Katmanı:**  Mapping, Service Impl, Validations, Exceptions ⇒ Reference Repository Layer\n 5. **API :**  Reference Service Layer\n 6. **WEB :** Reference Service Layer Or Use API\n\nSeparation of concern (SoC) (İlgili kod ilgili yerde bulunacak) prensibine uygun AspNetAPI-MVC proje yapısı.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feypacr%2Faspnetapi-mvc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feypacr%2Faspnetapi-mvc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feypacr%2Faspnetapi-mvc/lists"}