Ana Sayfa Hakkımda Dersler Blog Mikrofonda İletişim Projeler
Dersler ASP.NET CORE · C#

ASP.NET Core — Action Filter ile Stok Kontrolü

9 dk okuma · Emre Ulutabak
1
Action Filter nedir?

Bir kullanıcı bir sayfaya gitmek istediğinde bazen action çalışmadan önce bazı kontroller yapmak isteriz. Mesela ürün stokta mı, kullanıcı aktif mi, üyelik geçerli mi?

Bu tür ortak kontrolleri her action içine tekrar tekrar yazmak yerine Action Filter kullanırız.

Action Filter, controller action çalışmadan önce devreye giren bir ara kontrol katmanıdır.

💡
Aynı kontrol birçok action’da tekrar ediyorsa, filter iyi bir adaydır.
2
Hikaye: Kafedeki sipariş ekranı

Şimdi farklı bir örnek düşünelim. Bir kafe otomasyonunda müşteri ekrandan kahve siparişi verecek.

Ama bazı içecekler tükenmiş olabilir. Kullanıcı sipariş sayfasına girmeden önce sistem, seçilen ürünün stokta olup olmadığını kontrol etmek istiyor.

Eğer stok varsa devam edilir. Yoksa kullanıcı boşuna forma girmez; doğrudan OutOfStock sayfasına yönlendirilir.

İşte bu kontrolü action içine tek tek yazmak yerine bir filter ile merkezi hale getirebiliriz.

3
Neden gerekli?

Diyelim ki sipariş oluşturma, hızlı sipariş, kampanyalı sipariş ve mobil sipariş gibi birden fazla action’ın var. Hepsinde aynı stok kontrolünü tekrar etmek kodu uzatır.

Üstelik bir gün kural değişirse hepsini tek tek düzenlemek gerekir.

Filter kullanınca bu kuralı tek yere koyarsın. Böylece hem tekrar azalır hem de kod daha okunur olur.

4
Kısa örnek

Aşağıdaki örnekte filter, action’a gelen productId değerini alıyor. Sonra stok servisine soruyor: “Bu ürün şu anda var mı?”

Eğer ürün yoksa kullanıcıyı başka sayfaya yönlendiriyor. Varsa action’ın çalışmasına izin veriyor.

csharp
public class RequireStockFilter : IAsyncActionFilter
{
    private readonly IStockService _stockService;

    public RequireStockFilter(IStockService stockService)
    {
        _stockService = stockService;
    }

    public async Task OnActionExecutionAsync(
        ActionExecutingContext context,
        ActionExecutionDelegate next)
    {
        var productId = context.ActionArguments["productId"] as int?;

        if (productId.HasValue)
        {
            var hasStock = await _stockService
                .HasStockAsync(productId.Value);

            if (!hasStock)
            {
                context.Result = new RedirectToActionResult(
                    "OutOfStock",
                    "Shop",
                    null);
                return;
            }
        }

        await next();
    }
}
💡
Uzun satırları bölmek kod bloğunu daha temiz gösterir ve yatay scroll riskini azaltır.
5
context.Result mantığı

Filter içindeki en önemli fikirlerden biri şudur: Eğer context.Result verirsen action artık çalışmaz.

Yani sistem “buradan sonrası iptal, sonucu ben belirledim” demiş olur.

Biz de bunu stok yoksa kullanıcıyı başka sayfaya göndermek için kullanıyoruz.

csharp
context.Result = new RedirectToActionResult(
    "OutOfStock",
    "Shop",
    null);
return;
💡
context.Result akışı keser, await next() ise akışı devam ettirir.
6
Controller üzerinde kullanım

Bu filter’ın en güçlü tarafı burada görülür. Controller üzerine bir kez eklediğinde, ilgili action’lar bu kuraldan otomatik geçer.

Böylece action içinde tekrar stok kontrolü yazmana gerek kalmaz.

csharp
[ServiceFilter(typeof(RequireStockFilter))]
public class OrderController : Controller
{
    [HttpGet]
    public IActionResult Create(int productId)
    {
        return View();
    }
}

Burada kullanıcı Create action’ına gitmek istediğinde önce filter çalışır. Ürün uygunsa action açılır, değilse kullanıcı yönlendirilir.

7
Altın kurallar

Action Filter yazarken sadece teknik olarak çalışan bir yapı kurmak yetmez. Aynı zamanda neden burada olduğunu da net anlatabilmelidir.

İyi bir filter, tekrar eden kontrolü tek noktaya toplar ve controller’ı sade bırakır.

💡
Filter’ı, bir action’dan çok bir kuralın evi gibi düşün.
💡
Tekrar eden kontrol varsa merkezi hale getirmek çoğu zaman daha iyidir.
💡
Kod örneklerinde kısa satırlar kullanmak hem okunurluğu hem görsel düzeni iyileştirir.
MİNİ QUIZ
Aşağıdakilerden hangisi doğrudur?
Action Filter sadece veritabanı tabloları oluşturur
Action Filter, action çalışmadan önce ortak kontrol yapmak için kullanılabilir
context.Result verilirse action yine de kesin çalışır
ServiceFilter sadece JavaScript dosyalarında kullanılır