Günümüzün karmaşık yazılım projelerinde, sürdürülebilir, ölçeklenebilir ve yönetimi kolay API’ler tasarlamak kritik öneme sahiptir. C# ve ASP.NET Core, bu hedeflere ulaşmak için güçlü araçlar sunar. Bu makale, modern yazılım mimarisinin temel taşları olan modüler tasarım, Dependency Injection (DI) ile bağımlılık yönetimi ve yeniden kullanılabilir katmanların (middleware ve servisler) nasıl oluşturulacağını derinlemesine incelemektedir. Bu pratikler, uygulamanızın esnekliğini ve test edilebilirliğini önemli ölçüde artıracaktır.

Modüler API Tasarımı ve Katmanlı Mimari Yaklaşımı

Geleneksel katmanlı mimariler (Sunum, İş, Veri) yerine, modern ASP.NET Core uygulamaları genellikle dikey dilimleme (Vertical Slice Architecture) veya özellik odaklı (Feature Folders) modüler tasarımları tercih eder. Modüler API tasarımı, uygulamanın farklı işlevlerini veya domainlerini birbirinden izole edilmiş mantıksal birimler halinde gruplamayı hedefler.

Neden Modülerlik? (Separation of Concerns)

  • Bakım Kolaylığı: Bir özellik üzerinde yapılan değişiklik, uygulamanın tamamen farklı bir bölümünü etkilemez.
  • Ölçeklenebilirlik: Yüksek trafik alan modüller, diğerlerinden bağımsız olarak ölçeklendirilebilir (mikroservis mimarisine geçişi kolaylaştırır).
  • Ekip Çalışması: Farklı geliştirici ekipleri, çakışmaları en aza indirerek kendi modülleri üzerinde eş zamanlı çalışabilir.

Modüler bir yapı kurarken, her modülün kendi Controller, Service, Repository ve DTO (Data Transfer Object) yapılarını barındırmasına dikkat edilmelidir. Bu, her modülün mümkün olduğunca bağımsız olmasını ve yalnızca gerekli arayüzler (interface) üzerinden iletişim kurmasını sağlar.

Dependency Injection (DI) ile Bağımlılık Yönetiminin Gücü

Dependency Injection (DI), modern C# ve ASP.NET Core’un temelini oluşturur. Bağımlılıkları kod içinde doğrudan oluşturmak yerine (tight coupling), onları dışarıdan sağlamak (inversion of control) ilkesine dayanır. Bu yöntem, bağımlılıkları azaltarak kodun test edilebilirliğini ve esnekliğini dramatik bir şekilde artırır.

ASP.NET Core’da DI Uygulaması

ASP.NET Core, yerleşik bir IoC (Inversion of Control) konteynerine sahiptir. Servisler, genellikle başlangıç sınıfında (Program.cs veya eski versiyonlarda Startup.cs) IServiceCollection arayüzü kullanılarak kaydedilir. Kayıt tipleri, servisin yaşam döngüsünü belirler:

  • AddScoped: Aynı HTTP isteği süresince aynı örneği döndürür.
  • AddTransient: Her talep edildiğinde yeni bir örnek oluşturur (hafif, durumsuz servisler için idealdir).
  • AddSingleton: Uygulama çalıştığı sürece yalnızca tek bir örnek oluşturur (yapılandırma veya önbellek servisleri için kullanılır).

Örnek: Modül Tabanlı Servis Kaydı

Büyük projelerde, tüm servisleri tek bir yerde kaydetmek yerine, modüler yapıyı desteklemek için uzatma metotları (extension methods) kullanılır:

public static class UserServiceRegistration
{
    public static IServiceCollection AddUserServices(this IServiceCollection services)
    {
        services.AddScoped<IUserRepository, UserRepository>();
        services.AddScoped<IUserService, UserService>();
        return services;
    }
}
// Program.cs içinde: builder.Services.AddUserServices();

Bu yaklaşım, bağımlılık kayıtlarını ilgili modüllerin içine taşıyarak Program.cs dosyasını temiz tutar ve modülerliği pekiştirir.

Reusable Middleware Oluşturma ve Cross-Cutting Concerns

Middleware, ASP.NET Core istek işleme hattının (pipeline) ayrılmaz bir parçasıdır. Her bir middleware, gelen bir isteği işleyebilir, değiştirebilir veya bir sonraki middleware’e devredebilir. Yeniden kullanılabilir middleware’ler, uygulamanın tamamını ilgilendiren kesişimsel sorunları (cross-cutting concerns) çözmek için mükemmeldir.

Yaygın Middleware Kullanım Alanları:

  • İstek/Yanıt Loglama ve İzleme (Logging & Tracing)
  • Hata Yakalama ve Özel Hata Yanıtları Üretme (Custom Exception Handling)
  • Güvenlik Başlıklarını Ekleme (Security Headers)
  • İşlem Kimliği (Correlation ID) Yönetimi

Bir middleware oluşturmak için genellikle IMiddleware arayüzü uygulanır veya RequestDelegate parametresi alan bir sınıf tanımlanır. Yeniden kullanılabilirlik sağlamak için, middleware’inizi basit bir Use[Adı] uzatma metodu ile pipeline’a eklenir hale getirmelisiniz.

// Middleware Kaydı Örneği (Program.cs)
app.UseMiddleware<CorrelationIdMiddleware>();

// Veya daha temiz bir uzatma metodu ile:
app.UseCustomCorrelationId();

Service Pattern ile İş Mantığını Kapsülleme

API denetleyicileri (Controllers), HTTP trafiğini yönetmek (routing, input validation, response formatting) dışında iş mantığı içermemelidir. Tüm karmaşık iş kuralları ve domain etkileşimleri Service Pattern kullanılarak ayrılmış katmanlarda ele alınmalıdır.

Katmanlar Arası İlişki

Controller’lar, Dependency Injection aracılığıyla ihtiyaç duydukları servis arayüzlerini (Interface) talep ederler. Servisler (örneğin IProductService), iş akışını yürütür ve genellikle Repository katmanları (veri erişimi) ile etkileşime girer.

Avantajları:

  • Test Edilebilirlik: Servis sınıfları, HTTP bağlamından tamamen bağımsızdır ve izole bir şekilde birim testine tabi tutulabilir (Controller’lar mock edilebilir).
  • Yeniden Kullanılabilirlik: Aynı iş mantığı (örneğin “sipariş oluşturma” mantığı) farklı Controller’lar veya hatta farklı uygulamalar tarafından kullanılabilir.
  • Tek Sorumluluk İlkesi (SRP): Her servis, belirli bir iş sorumluluğuna odaklanır.

Servisler, işlem yönetimi, veri dönüşümleri ve domain nesnelerinin validasyonunu içererek uygulamanın temel davranışını tanımlar. Bu katman, modüler API tasarımının “İş” kısmını oluşturur ve uygulamanın en kritik bileşenidir.

Özetle, C# ve ASP.NET Core projelerinde modüler mimariyi benimsemek, Dependency Injection’ı etkin kullanmak ve yeniden kullanılabilir servis/middleware katmanları oluşturmak, uygulamanızın gelecekteki başarısının anahtarıdır. Bu yapılar, kod tekrarını azaltır, test süreçlerini hızlandırır ve büyük ölçekli uygulamalarda esnekliği garanti eder. Modern geliştirme pratiklerine odaklanarak, daha temiz, daha yönetilebilir ve daha performanslı API’ler inşa edebilirsiniz. Bu mimari, projelerinizin sürdürülebilirliğini üst düzeye taşıyacaktır.