Carter Nedir?
Elbette Ayhan, sana Carter kütüphanesini detaylı şekilde açıklayayım.
🎯 Carter Nedir?
Carter, ASP.NET Core için geliştirilmiş hafif ve fonksiyonel bir API routing (yönlendirme) framework’üdür. ASP.NET Core’un alt yapısını kullanır ama minimal ve okunabilir bir yapı sunar. Özellikle Minimal API yaklaşımını sevenler için güçlü bir alternatiftir.
❝Kısacası: Carter, ASP.NET Core’un sade ve modüler bir şekilde web API yazılmasını kolaylaştıran bir eklentisidir.❞
✅ Neden Carter Kullanılır?
- Daha temiz bir route tanımı (Routing)
- Katmanlı mimari içinde ayrık endpoint modülleri yazma imkanı
IModule
yapısıyla endpoint’leri modüllere ayırma kolaylığı- Middleware, validation, DI gibi ASP.NET Core altyapısını kullanmaya devam edebilirsin
📦 Nasıl Kurulur?
- .NET 9.0 API projesi oluştur:
dotnet new webapi -n CarterExample
cd CarterExample
- NuGet ile Carter kur:
dotnet add package Carter
🧱 Basit Carter Modül Örneği
1. Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCarter();
var app = builder.Build();
app.MapCarter(); // Carter endpoint’lerini buradan ekler
app.Run();
2. Modules/HelloModule.cs
dosyası oluştur:
using Carter;
public class HelloModule : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
app.MapGet("/hello", () => Results.Ok("Merhaba Carter!"));
}
}
Bu yapı sayesinde farklı endpoint’leri ayrı modüller altında toparlayabilirsin.
🧰 Diğer Özellikler
➕ Model Binding
app.MapPost("/person", (Person p) => $"Ad: {p.Name}, Yaş: {p.Age}");
➕ Middleware Entegrasyonu
ASP.NET Core pipeline’ı aynen kullanılabilir. app.UseAuthentication()
, UseAuthorization()
, UseCors()
gibi özelliklerle uyumlu.
➕ Dependency Injection desteği tam:
public class ProductModule : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
app.MapGet("/products", (IProductService productService) =>
{
var products = productService.GetAll();
return Results.Ok(products);
});
}
}
🖼️ Yapı Görseli (Sözlü Tarif)
CarterExample/
│
├── Program.cs → Uygulamanın başlangıç noktası
├── Modules/
│ └── HelloModule.cs → Tüm /hello endpoint’i burada
│ └── ProductModule.cs → Tüm /products endpoint’leri burada
│
├── Services/ → (Opsiyonel) DI servisleri
│
└── CarterExample.csproj → .NET 9.0 projesi
🟡 Carter ile Normal ASP.NET Core Arasındaki Fark
Özellik | Carter | ASP.NET Core (Klasik) |
---|---|---|
Route tanımı | ICarterModule ile modüler | MapGet , Controller vb. |
Katman yapısı | Daha ayrık modüller | Kısmen bağlılık içerir |
Kod okunabilirliği | Daha sade | Daha karmaşık hale gelebilir |
Öğrenme eğrisi | Minimal API deneyimi olanlar için kolay | MVC’den gelenler için alışkanlık |
🔚 Sonuç
Carter, Minimal API seven ama büyük yapıları daha düzenli modüllerle yönetmek isteyen geliştiriciler için çok idealdir. Yüksek performans, kolay test edilebilirlik ve temiz kod avantajları sunar.
Carter ile ASP.NET Core’da model validation (model doğrulama) işlemleri oldukça sade ve güçlü bir şekilde yapılabilir. Carter, ASP.NET Core’un altyapısını kullandığı için, FluentValidation, DataAnnotations
veya özel validasyonlar ile tamamen uyumludur. Aşağıda adım adım model validation konusunu açıklayacağım:
🔍 1. Genel Bakış: Carter ve Validasyon
Carter, doğrudan FluentValidation
ile entegre çalışacak şekilde tasarlanmıştır. Bu sayede:
- Her endpoint için ayrı validator yazılabilir.
- Carter, validation hatalarını yakalayıp 400 Bad Request dönmenizi kolaylaştırır.
- Middleware ile tüm validation süreci yönetilebilir.
✅ 2. Kullanım Adımları
📦 Gerekli Paketler
dotnet add package FluentValidation
dotnet add package Carter
dotnet add package FluentValidation.DependencyInjectionExtensions
📁 Model
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
🧪 Validator Sınıfı
using FluentValidation;
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(p => p.Name).NotEmpty().WithMessage("İsim boş olamaz.");
RuleFor(p => p.Age).InclusiveBetween(18, 99).WithMessage("Yaş 18-99 arası olmalı.");
}
}
🧩 Carter Module (Validation ile birlikte)
using Carter;
using FluentValidation;
using FluentValidation.Results;
public class PersonModule : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
app.MapPost("/person", async (Person person, IValidator<Person> validator) =>
{
ValidationResult result = await validator.ValidateAsync(person);
if (!result.IsValid)
{
var errors = result.Errors.Select(e => new { e.PropertyName, e.ErrorMessage });
return Results.BadRequest(errors);
}
return Results.Ok(new { Message = "Kişi başarıyla alındı.", person });
});
}
}
🧠 Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCarter();
builder.Services.AddValidatorsFromAssemblyContaining<PersonValidator>(); // Validatorları otomatik bulur
var app = builder.Build();
app.MapCarter();
app.Run();
📤 Örnek Request / Response
✅ Doğru Veri:
POST /person
Content-Type: application/json
{
"name": "Ayhan",
"age": 44
}
Yanıt:
{
"message": "Kişi başarıyla alındı.",
"person": {
"name": "Ayhan",
"age": 44
}
}
❌ Hatalı Veri:
POST /person
Content-Type: application/json
{
"name": "",
"age": 12
}
Yanıt:
[
{
"propertyName": "Name",
"errorMessage": "İsim boş olamaz."
},
{
"propertyName": "Age",
"errorMessage": "Yaş 18-99 arası olmalı."
}
]
🔧 Alternatif: FluentValidation Middleware (Opsiyonel)
FluentValidation’ı global middleware olarak çalıştırmak istersen, şu şekilde entegre edebilirsin:
builder.Services.AddFluentValidationAutoValidation();
Bu durumda validation işlemi otomatik olarak gerçekleşir, endpoint içinde manuel kontrol yapmana gerek kalmaz. Ama Carter’da bu bazen tercih edilmeyebilir çünkü kontrolü elinde tutmak istersin.
🎯 Sonuç
- Carter,
FluentValidation
ile sorunsuz çalışır. - Validation mantığını endpoint içinde veya global middleware ile uygulayabilirsin.
- Validation hataları sade, anlaşılır ve özelleştirilebilir biçimde dönebilir.