16, May 2025
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?

  1. .NET 9.0 API projesi oluştur:
dotnet new webapi -n CarterExample
cd CarterExample
  1. 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

ÖzellikCarterASP.NET Core (Klasik)
Route tanımıICarterModule ile modülerMapGet, Controller vb.
Katman yapısıDaha ayrık modüllerKısmen bağlılık içerir
Kod okunabilirliğiDaha sadeDaha karmaşık hale gelebilir
Öğrenme eğrisiMinimal API deneyimi olanlar için kolayMVC’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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir