C#’da Zincir Sorumluluk Desenini Uygulama: Orta Katman Deseni
Yazılım dünyasında, karmaşık iş mantığına sahip uygulamalar geliştirmek için farklı tasarım desenleri kullanılır. Bu desenlerden biri de Zincir Sorumluluk Deseni (Chain of Responsibility Pattern) olarak bilinir. Bu desen, bir istek zincirini oluşturarak, her istek için belirli bir işlevi yerine getiren nesnelerin birbirine bağlanmasına olanak tanır. Bu sayede, istekler zincir boyunca hareket eder ve karşılaşılan ilk uygun nesne tarafından işlenir. Bu yaklaşım, kodunuzun daha düzenli, esnek ve genişletilebilir olmasını sağlar.
Zincir Sorumluluk Deseni Nedir?
Zincir Sorumluluk Deseni, bir isteğin işlenmesi sorumluluğunu bir nesne zincirine devreden bir tasarım deseni. Bu zincirde, her nesne bir istek işlemeyi deneyebilir. İstek işlenemiyorsa, bir sonraki nesneye devredilir. Bu desen, istek işleme mantığını modüler hale getirmek ve karmaşıklığı azaltmak için kullanılabilir. Orta Katmanlar (Middlewares) olarak da bilinen bu desen, günümüz web uygulamalarında yaygın olarak kullanılır.
Orta Katmanlar (Middlewares)
Orta Katmanlar (Middlewares), bir istek işlenmeden önce veya sonra belirli eylemler gerçekleştiren ve uygulamanıza ek işlevsellik sağlayan nesnelerdir. Örnek olarak, kimlik doğrulama, yetkilendirme, günlük kaydı, hata işleme gibi işlevleri gerçekleştirebilirler. Orta Katmanlar, Zincir Sorumluluk Desenini kullanarak birbirlerine bağlanır ve istekler zincir boyunca hareket eder.
C#’da Orta Katmanları Uygulama
C#’da Orta Katmanları uygulamak için, bir ara yüz (interface) tanımlayarak başlayabiliriz. Bu ara yüz, orta katmanların temel işlevini, yani bir sonraki orta katmana bir istek geçirmeyi tanımlar. Aşağıda, bir IMiddleware ara yüzü örneği gösterilmiştir:
public interface IMiddleware
{
Task InvokeAsync(HttpContext context, RequestDelegate next);
}
Bu ara yüz, InvokeAsync adlı bir metot içerir. Bu metot, HttpContext nesnesi ve bir sonraki orta katmanı temsil eden RequestDelegate nesnesini parametre olarak alır. Orta katmanlar, bu metodu istekleri işlemek için kullanır. Aşağıdaki örnekte, bir LoggerMiddleware sınıfı gösterilmiştir. Bu sınıf, IMiddleware ara yüzünü uygular ve InvokeAsync metodunda istek başlangıç ve bitiş zamanlarını kaydeder.
public class LoggerMiddleware : IMiddleware
{
private readonly ILogger _logger;
public LoggerMiddleware(ILogger logger)
{
_logger = logger;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var startTime = DateTime.Now;
_logger.LogInformation("Request started at {Time}", startTime);
await next(context);
var endTime = DateTime.Now;
_logger.LogInformation("Request completed at {Time}", endTime);
}
}
Bu örnekte, LoggerMiddleware sınıfı, InvokeAsync metodunda bir istek işlenirken başlangıç ve bitiş zamanlarını günlük kaydı sistemi üzerinden kaydeder. Daha sonra, next(context) koduyla isteğin işlenmesi bir sonraki orta katmana devredilir.
Zincir Sorumluluk Desenini Kullanarak Orta Katmanlar Oluşturma
Orta Katmanlar, bir istek işlenmeden önce veya sonra belirli eylemler gerçekleştiren ve uygulamanıza ek işlevsellik sağlayan nesnelerdir. Birden fazla Orta Katman kullanarak isteğin işlenmesi sırasında farklı eylemler gerçekleştirebilirsiniz. Örneğin, kimlik doğrulama, yetkilendirme ve hata işleme gibi işlevleri ayrı orta katmanlar kullanarak gerçekleştirebilirsiniz. Orta Katmanları birbirine bağlayarak isteğin işlenmesi sırasındaki eylemleri belirleyebilirsiniz.
Aşağıdaki örnekte, bir AuthenticationMiddleware sınıfı gösterilmiştir. Bu sınıf, kullanıcının kimlik doğrulamasını yapar. Eğer kullanıcı geçerli bir kimlikle giriş yapmışsa, isteğin işlenmesi bir sonraki orta katmana devredilir. Aksi takdirde, kullanıcı giriş sayfasına yönlendirilir.
public class AuthenticationMiddleware : IMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (!context.User.Identity.IsAuthenticated)
{
context.Response.Redirect("/login");
return;
}
await next(context);
}
}
Bu örnekte, AuthenticationMiddleware sınıfı, InvokeAsync metodunda kullanıcının kimlik doğrulamasını yapar. Eğer kullanıcı geçerli bir kimlikle giriş yapmışsa, next(context) koduyla isteğin işlenmesi bir sonraki orta katmana devredilir. Aksi takdirde, kullanıcı giriş sayfasına yönlendirilir.
Orta Katmanları Birbirine Bağlama
Orta Katmanları birbirine bağlamak için, bir MiddlewareBuilder sınıfı tanımlayabilirsiniz. Bu sınıf, orta katmanları bir listede tutar ve bir istek geldiğinde, bu listedeki orta katmanları sırayla çağırır.
public class MiddlewareBuilder
{
private readonly List _middlewares = new List();
public MiddlewareBuilder Use(IMiddleware middleware)
{
_middlewares.Add(middleware);
return this;
}
public async Task InvokeAsync(HttpContext context)
{
var next = new RequestDelegate(async ctx => await Task.CompletedTask);
foreach (var middleware in _middlewares.Reverse())
{
next = async ctx => await middleware.InvokeAsync(ctx, next);
}
await next(context);
}
}
Bu örnekte, MiddlewareBuilder sınıfı, Use metodu ile yeni orta katmanlar eklemeyi sağlar. InvokeAsync metodu ise orta katman listesini tersine çevirir ve her orta katmanı sırayla çağırır. Bu şekilde, istek zincir boyunca hareket eder ve her orta katman tarafından işlenir. next değişkeni, bir sonraki orta katmanı temsil eder ve her orta katman, next(context) koduyla isteğin işlenmesini bir sonraki orta katmana devreder.
Zincir Sorumluluk Deseninin Avantajları
Zincir Sorumluluk Deseni, aşağıdaki avantajları sağlar:
- Esneklik: Yeni orta katmanlar eklemek veya mevcut orta katmanları değiştirmek kolaydır. Bu sayede, uygulamanızın iş mantığını kolayca genişletebilirsiniz.
- Modülerlik: Her orta katman, belirli bir işlevi yerine getirir. Bu sayede, kodunuzu daha düzenli ve anlaşılabilir hale getirebilirsiniz.
- Sorumluluk Ayrımı: Her orta katman, belirli bir sorumluluğa sahiptir. Bu sayede, kodunuzu daha kolay yönetmeniz ve hataları bulmanız mümkün olur.
Zincir Sorumluluk Deseninin Uygulama Alanları
Zincir Sorumluluk Deseni, aşağıdaki gibi alanlarda kullanılabilir:
- Web Uygulamaları: Kimlik doğrulama, yetkilendirme, günlük kaydı, hata işleme gibi işlevleri gerçekleştirmek için kullanılabilir.
- Dosya İşleme: Bir dosyanın açılması, okunması, işlenmesi ve kaydedilmesi işlemlerini gerçekleştirmek için kullanılabilir.
- Oyun Geliştirme: Oyun içi olayları işlemeyi ve oyun mantığını yönetmeyi kolaylaştırmak için kullanılabilir.
Sonuç
Zincir Sorumluluk Deseni, yazılım geliştirmede yaygın olarak kullanılan bir tasarım deseni. Bu desen, bir isteğin işlenmesi sorumluluğunu bir nesne zincirine devrederek, kodunuzu daha düzenli, esnek ve genişletilebilir hale getirir. Orta Katmanlar (Middlewares) olarak bilinen bu desen, günümüz web uygulamalarında yaygın olarak kullanılır. Zincir Sorumluluk Desenini kullanarak, uygulamalarınızı daha kolay ve etkin bir şekilde geliştirebilirsiniz.
Not: Bu makalede, örnek kodlar sadece kavramları göstermek içindir. Gerçek uygulamalarda, bu kodların daha detaylı ve kapsamlı olması gerekebilir.
Öneriler
Eğer C#’da tasarım desenleri hakkında daha fazla bilgi edinmek istiyorsanız, aşağıdaki kaynaklara göz atabilirsiniz:
#Etiketler
C#, Zincir Sorumluluk Deseni, Orta Katman, Middleware, Design Pattern, Tasarım Deseni, Uygulama, Geliştirme, Yazılım, Kod, Esneklik, Modülerlik, Sorumluluk Ayrımı, Web Uygulamaları, Dosya İşleme, Oyun Geliştirme