{"id":31049,"date":"2025-10-05T04:01:31","date_gmt":"2025-10-05T01:01:31","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/"},"modified":"2025-10-05T04:01:31","modified_gmt":"2025-10-05T01:01:31","slug":"asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/","title":{"rendered":"ASP.NET Core&#8217;da FluentValidation ile Veri Do\u011frulama Sanat\u0131"},"content":{"rendered":"<p>Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation&#8217;\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.<\/p>\n<p>Bir web uygulamas\u0131, kullan\u0131c\u0131dan gelen girdilerle s\u00fcrekli etkile\u015fim halindedir. Bu girdiler, bir kay\u0131t formu, \u00fcr\u00fcn sipari\u015fi ya da arama sorgusu olabilir. Ancak, her zaman beklenen formatta veya de\u011fer aral\u0131\u011f\u0131nda olmayabilirler. Ge\u00e7ersiz veya k\u00f6t\u00fc niyetli verilerin sisteme girmesi, uygulaman\u0131n \u00e7\u00f6kmesine, g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7mas\u0131na, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fcn bozulmas\u0131na ve dolay\u0131s\u0131yla kullan\u0131c\u0131 deneyiminin olumsuz etkilenmesine neden olabilir. Bu nedenle, verilerin i\u015flenmeden \u00f6nce do\u011fru ve ge\u00e7erli oldu\u011fundan emin olmak hayati bir ad\u0131md\u0131r.<\/p>\n<p>Geleneksel olarak, ASP.NET Core&#8217;da veri do\u011frulama i\u00e7in genellikle Data Annotations (veri a\u00e7\u0131klamalar\u0131) kullan\u0131l\u0131r. Bu y\u00f6ntem, model \u00f6zelliklerinin \u00fczerine <code>[Required]<\/code>, <code>[StringLength]<\/code> gibi nitelikler eklemeyi i\u00e7erir. Ancak, i\u015f mant\u0131\u011f\u0131 karma\u015f\u0131kla\u015ft\u0131k\u00e7a veya birden fazla do\u011frulama kural\u0131 bir araya geldi\u011finde, Data Annotations y\u00f6ntemi yeterince esnek olmayabilir. Kurallar modelin i\u00e7ine da\u011f\u0131ld\u0131\u011f\u0131 i\u00e7in kodun okunabilirli\u011fi d\u00fc\u015fer ve \u00f6zellikle ayn\u0131 modelin farkl\u0131 senaryolarda farkl\u0131 do\u011frulama kurallar\u0131na ihtiya\u00e7 duymas\u0131 durumunda y\u00f6netimi zorla\u015f\u0131r. \u0130\u015fte tam bu noktada FluentValidation devreye girer. FluentValidation, do\u011frulama kurallar\u0131n\u0131 ayr\u0131 s\u0131n\u0131flarda tan\u0131mlayarak modelden ay\u0131r\u0131r ve b\u00f6ylece daha temiz, daha test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir bir kod yap\u0131s\u0131 sunar. Bu sayede, uygulaman\u0131z\u0131n do\u011frulama katman\u0131 ba\u011f\u0131ms\u0131z bir birim olarak ele al\u0131nabilir ve gerekti\u011finde kolayca de\u011fi\u015ftirilebilir veya geni\u015fletilebilir.<\/p>\n<p>FluentValidation&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, lambda ifadeleri kullanarak kurallar\u0131 son derece okunabilir ve ak\u0131c\u0131 bir \u015fekilde tan\u0131mlaman\u0131za olanak tan\u0131mas\u0131d\u0131r. Bu, kurallar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r ve yeni bir geli\u015ftiricinin projeye adapte olmas\u0131n\u0131 h\u0131zland\u0131r\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n e-posta adresinin ge\u00e7erli bir formatta olmas\u0131 gerekti\u011fini veya bir \u015fifrenin minimum uzunlu\u011fa sahip olmas\u0131 gerekti\u011fini belirtmek, FluentValidation ile adeta do\u011fal bir dilmi\u015f gibi yaz\u0131labilir. Ayr\u0131ca, ko\u015fullu do\u011frulama, \u00f6zel hata mesajlar\u0131, kural k\u00fcmeleri ve asenkron do\u011frulama gibi g\u00fc\u00e7l\u00fc \u00f6zellikler sayesinde, en karma\u015f\u0131k do\u011frulama senaryolar\u0131 bile \u015feffaf ve y\u00f6netilebilir bir \u015fekilde ele al\u0131nabilir. Bu esneklik, \u00f6zellikle b\u00fcy\u00fck ve s\u00fcrekli geli\u015fen projelerde zaman ve emek tasarrufu sa\u011flar, ayn\u0131 zamanda yaz\u0131l\u0131m kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Dolay\u0131s\u0131yla, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in FluentValidation, ASP.NET Core projelerinde vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir.<\/p>\n<h2>ASP.NET Core&#8217;da FluentValidation: Temel Kavramlar Nelerdir?<\/h2>\n<p>FluentValidation, .NET d\u00fcnyas\u0131nda pop\u00fcler bir do\u011frulama k\u00fct\u00fcphanesidir ve ASP.NET Core ile m\u00fckemmel bir uyum i\u00e7inde \u00e7al\u0131\u015f\u0131r. Temel amac\u0131, model do\u011frulama kurallar\u0131n\u0131 a\u00e7\u0131k ve okunabilir bir \u015fekilde tan\u0131mlaman\u0131za olanak tan\u0131makt\u0131r. Gelin, FluentValidation&#8217;\u0131n temel yap\u0131 ta\u015flar\u0131na ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na yak\u0131ndan bakal\u0131m.<\/p>\n<h3>Model ve Do\u011frulay\u0131c\u0131 (Validator) Ayr\u0131m\u0131<\/h3>\n<p>FluentValidation&#8217;\u0131n merkezinde &#8220;model&#8221; ve &#8220;do\u011frulay\u0131c\u0131&#8221; kavramlar\u0131n\u0131n net bir \u015fekilde ayr\u0131lmas\u0131 yatar. Bir model, uygulaman\u0131z\u0131n i\u015fleyece\u011fi verileri (\u00f6rne\u011fin, bir kullan\u0131c\u0131 kayd\u0131 formu veya bir \u00fcr\u00fcn detay\u0131) temsil eden d\u00fcz bir C# s\u0131n\u0131f\u0131d\u0131r. Do\u011frulay\u0131c\u0131 ise, bu model \u00fczerindeki do\u011frulama kurallar\u0131n\u0131 i\u00e7eren ayr\u0131 bir s\u0131n\u0131ft\u0131r. Bu ayr\u0131m, model s\u0131n\u0131flar\u0131n\u0131z\u0131n i\u015f mant\u0131\u011f\u0131ndan ve do\u011frulama kurallar\u0131ndan ba\u011f\u0131ms\u0131z kalmas\u0131n\u0131 sa\u011flar. B\u00f6ylece, modeliniz sadece veriyi ta\u015f\u0131rken, do\u011frulay\u0131c\u0131n\u0131z sadece bu verinin ge\u00e7erlili\u011fini kontrol eder.<\/p>\n<p>\u00d6rne\u011fin, bir <code>KullaniciKayitModel<\/code>&#8216;iniz varsa, buna kar\u015f\u0131l\u0131k gelen bir <code>KullaniciKayitValidator<\/code> s\u0131n\u0131f\u0131n\u0131z olur. Bu do\u011frulay\u0131c\u0131 s\u0131n\u0131f\u0131, <code>AbstractValidator<KullaniciKayitModel><\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilir ve yap\u0131c\u0131 metodu (constructor) i\u00e7inde modelin her bir \u00f6zelli\u011fi i\u00e7in do\u011frulama kurallar\u0131n\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r. Kurallar, <code>RuleFor()<\/code> metodu ile ba\u015flar ve ard\u0131ndan bir dizi zincirlenebilir do\u011frulama metodu (<code>NotEmpty()<\/code>, <code>EmailAddress()<\/code>, <code>Length()<\/code> vb.) ile devam eder. Bu ak\u0131c\u0131 (fluent) aray\u00fcz, kurallar\u0131n do\u011fal bir dil gibi okunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Fluent API ile Kural Tan\u0131mlama<\/h3>\n<p>FluentValidation&#8217;\u0131n en belirgin \u00f6zelliklerinden biri, do\u011frulama kurallar\u0131n\u0131 tan\u0131mlamak i\u00e7in kulland\u0131\u011f\u0131 ak\u0131c\u0131 (fluent) API&#8217;dir. Bu API, lambda ifadeleri ve metod zincirleme (method chaining) kullanarak kurallar\u0131 ard\u0131\u015f\u0131k ve okunabilir bir \u015fekilde yazman\u0131za imkan tan\u0131r. \u00d6rne\u011fin, bir e-posta adresinin bo\u015f olmamas\u0131 ve ge\u00e7erli bir e-posta format\u0131nda olmas\u0131 gerekti\u011fini \u015fu \u015fekilde belirtebilirsiniz:<\/p>\n<pre><code class=\"language-csharp\">\npublic class KullaniciKayitModel\n{\n    public string Ad { get; set; }\n    public string Soyad { get; set; }\n    public string Eposta { get; set; }\n    public string Sifre { get; set; }\n}\n\npublic class KullaniciKayitValidator : AbstractValidator<KullaniciKayitModel>\n{\n    public KullaniciKayitValidator()\n    {\n        RuleFor(k => k.Ad).NotEmpty().WithMessage(\"Ad alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\");\n        RuleFor(k => k.Soyad).NotEmpty().WithMessage(\"Soyad alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\");\n        RuleFor(k => k.Eposta)\n            .NotEmpty().WithMessage(\"E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .EmailAddress().WithMessage(\"Ge\u00e7erli bir e-posta adresi giriniz.\");\n        RuleFor(k => k.Sifre)\n            .NotEmpty().WithMessage(\"\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .MinimumLength(8).WithMessage(\"\u015eifre en az 8 karakter olmal\u0131d\u0131r.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>RuleFor()<\/code> metoduna ge\u00e7irilen lambda ifadesi (<code>k => k.Eposta<\/code>) hangi \u00f6zellik i\u00e7in kural tan\u0131mland\u0131\u011f\u0131n\u0131 belirtir. Ard\u0131ndan <code>NotEmpty()<\/code> ve <code>EmailAddress()<\/code> gibi do\u011frulay\u0131c\u0131 metotlar zincirlenir. Her kural i\u00e7in \u00f6zel hata mesajlar\u0131 <code>WithMessage()<\/code> metodu ile kolayca tan\u0131mlanabilir. Bu yap\u0131, hem karma\u015f\u0131k kurallar\u0131 ifade etme g\u00fcc\u00fc sunar hem de kodu anla\u015f\u0131l\u0131r k\u0131lar.<\/p>\n<h3>Dependency Injection (Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu) ile Entegrasyon<\/h3>\n<p>ASP.NET Core'un temel ta\u015flar\u0131ndan biri olan Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI), FluentValidation ile kusursuz bir \u015fekilde entegre olur. FluentValidation do\u011frulay\u0131c\u0131lar\u0131n\u0131z\u0131 ASP.NET Core'un servis kapsay\u0131c\u0131s\u0131na kaydetti\u011finizde, bunlar\u0131 kontrolc\u00fclerinizde veya di\u011fer servislerinizde kolayca kullanabilirsiniz. Bu, do\u011frulay\u0131c\u0131lar\u0131n\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r ve uygulaman\u0131z\u0131n daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar. Do\u011frulay\u0131c\u0131lar\u0131n\u0131z\u0131 ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ile y\u00f6netmek, test yazmay\u0131 da kolayla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc do\u011frulay\u0131c\u0131lar\u0131 ayr\u0131 ayr\u0131 test edebilir ve sahte (mock) ba\u011f\u0131ml\u0131l\u0131klarla \u00e7al\u0131\u015fabilirsiniz.<\/p>\n<p>Bu temel kavramlar, FluentValidation ile g\u00fc\u00e7l\u00fc ve s\u00fcrd\u00fcr\u00fclebilir veri do\u011frulama \u00e7\u00f6z\u00fcmleri olu\u015fturman\u0131z i\u00e7in sa\u011flam bir temel sa\u011flar. K\u00fct\u00fcphanenin sundu\u011fu bu esneklik ve okunabilirlik, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve ekip tabanl\u0131 projelerde geli\u015ftirici verimlili\u011fini art\u0131r\u0131r ve yaz\u0131l\u0131m kalitesini y\u00fckseltir.<\/p>\n<h2>FluentValidation Entegrasyonu: Ad\u0131m Ad\u0131m ASP.NET Core Uygulaman\u0131za Nas\u0131l Dahil Edilir?<\/h2>\n<p>ASP.NET Core uygulaman\u0131za FluentValidation'\u0131 entegre etmek olduk\u00e7a basit bir s\u00fcre\u00e7tir. Bu b\u00f6l\u00fcmde, gerekli ad\u0131mlar\u0131 ve yap\u0131land\u0131rmalar\u0131 ad\u0131m ad\u0131m ele alaca\u011f\u0131z, b\u00f6ylece uygulaman\u0131zda g\u00fc\u00e7l\u00fc bir do\u011frulama altyap\u0131s\u0131 kurabilirsiniz.<\/p>\n<h3>1. FluentValidation Paketlerini Y\u00fckleme<\/h3>\n<p>\u0130lk ad\u0131m, projenize FluentValidation NuGet paketlerini eklemektir. Genellikle iki ana pakete ihtiyac\u0131n\u0131z olacakt\u0131r: <code>FluentValidation<\/code> ve <code>FluentValidation.AspNetCore<\/code>. \u0130kinci paket, FluentValidation'\u0131n ASP.NET Core'un dahili model do\u011frulama mekanizmas\u0131yla entegrasyonunu sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">\ndotnet add package FluentValidation\ndotnet add package FluentValidation.AspNetCore\n<\/pre>\n<p><\/code><\/p>\n<p>Veya NuGet Paket Y\u00f6neticisi arac\u0131l\u0131\u011f\u0131yla bu paketleri projenize ekleyebilirsiniz.<\/p>\n<h3>2. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) ile FluentValidation'\u0131 Yap\u0131land\u0131rma<\/h3>\n<p>FluentValidation do\u011frulay\u0131c\u0131lar\u0131n\u0131z\u0131n ASP.NET Core'un DI sistemine kay\u0131t edilmesi gerekmektedir. Bu genellikle <code>Program.cs<\/code> (veya eski projelerde <code>Startup.cs<\/code>) dosyas\u0131nda <code>AddControllersWithViews()<\/code> veya <code>AddRazorPages()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 yerde ger\u00e7ekle\u015ftirilir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nusing FluentValidation;\nusing FluentValidation.AspNetCore;\nusing Microsoft.AspNetCore.Mvc;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ Add services to the container.\nbuilder.Services.AddControllersWithViews(); \/\/ veya AddControllers() e\u011fer sadece API ise\n\n\/\/ FluentValidation entegrasyonu\nbuilder.Services.AddFluentValidationAutoValidation(); \/\/ Model otomatik do\u011frulamas\u0131n\u0131 etkinle\u015ftirir\nbuilder.Services.AddFluentValidationClientsideAdapters(); \/\/ \u0130stemci taraf\u0131 do\u011frulama adapt\u00f6rlerini ekler\n\n\/\/ Do\u011frulay\u0131c\u0131lar\u0131n\u0131z\u0131 servis olarak kaydedin.\n\/\/ Assembly scanning ile t\u00fcm do\u011frulay\u0131c\u0131lar\u0131 otomatik olarak kaydedebilirsiniz.\nbuilder.Services.AddValidatorsFromAssemblyContaining<KullaniciKayitValidator>();\n\nvar app = builder.Build();\n\n\/\/ ... di\u011fer yap\u0131land\u0131rmalar\n\napp.Run();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda \u015funlar\u0131 yap\u0131yoruz:<\/p>\n<ul>\n<li><code>AddFluentValidationAutoValidation()<\/code>: ASP.NET Core'un varsay\u0131lan model do\u011frulama altyap\u0131s\u0131n\u0131 FluentValidation ile de\u011fi\u015ftirir. Bu sayede, FluentValidation kurallar\u0131na uymayan modeller otomatik olarak hatalar\u0131 yakalayacakt\u0131r.<\/li>\n<li><code>AddFluentValidationClientsideAdapters()<\/code>: Bu y\u00f6ntem, sunucu taraf\u0131nda tan\u0131mlad\u0131\u011f\u0131n\u0131z FluentValidation kurallar\u0131n\u0131n baz\u0131lar\u0131 i\u00e7in istemci taraf\u0131nda da do\u011frulama adapt\u00f6rleri olu\u015fturmaya \u00e7al\u0131\u015f\u0131r. Bu, kullan\u0131c\u0131lar\u0131n sunucuya istek g\u00f6ndermeden \u00f6nce an\u0131nda geri bildirim almas\u0131n\u0131 sa\u011flar ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir. Ancak t\u00fcm kurallar i\u00e7in istemci taraf\u0131 do\u011frulama otomatik olarak desteklenmeyebilir.<\/li>\n<li><code>AddValidatorsFromAssemblyContaining<KullaniciKayitValidator>()<\/code>: Bu \u00e7ok kullan\u0131\u015fl\u0131 bir metottur. Belirtti\u011finiz tipin bulundu\u011fu assembly (derleme) i\u00e7indeki t\u00fcm <code>AbstractValidator<\/code> t\u00fcrevlerini otomatik olarak DI konteynerine kaydeder. B\u00f6ylece her do\u011frulay\u0131c\u0131y\u0131 tek tek kaydetmek zorunda kalmazs\u0131n\u0131z.<\/li>\n<\/ul>\n<h3>3. Model ve Do\u011frulay\u0131c\u0131 S\u0131n\u0131flar\u0131n\u0131 Tan\u0131mlama<\/h3>\n<p>\u00d6nceki b\u00f6l\u00fcmde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, uygulaman\u0131zdaki her do\u011frulanabilir model i\u00e7in bir do\u011frulay\u0131c\u0131 s\u0131n\u0131f\u0131 olu\u015fturman\u0131z gerekir. \u00d6rne\u011fin, bir kay\u0131t i\u015flemi i\u00e7in <code>KullaniciKayitModel<\/code> ve buna kar\u015f\u0131l\u0131k gelen <code>KullaniciKayitValidator<\/code>.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Models\/KullaniciKayitModel.cs\npublic class KullaniciKayitModel\n{\n    public string Ad { get; set; }\n    public string Eposta { get; set; }\n    public string Sifre { get; set; }\n    public string SifreTekrar { get; set; }\n}\n\n\/\/ Validators\/KullaniciKayitValidator.cs\npublic class KullaniciKayitValidator : AbstractValidator<KullaniciKayitModel>\n{\n    public KullaniciKayitValidator()\n    {\n        RuleFor(k => k.Ad)\n            .NotEmpty().WithMessage(\"Ad alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .Length(2, 50).WithMessage(\"Ad en az 2, en fazla 50 karakter olmal\u0131d\u0131r.\");\n\n        RuleFor(k => k.Eposta)\n            .NotEmpty().WithMessage(\"E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .EmailAddress().WithMessage(\"Ge\u00e7erli bir e-posta adresi giriniz.\");\n\n        RuleFor(k => k.Sifre)\n            .NotEmpty().WithMessage(\"\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .MinimumLength(8).WithMessage(\"\u015eifre en az 8 karakter olmal\u0131d\u0131r.\");\n\n        RuleFor(k => k.SifreTekrar)\n            .Equal(k => k.Sifre).WithMessage(\"\u015eifreler e\u015fle\u015fmiyor.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>4. Kontrolc\u00fcn\u00fczde Do\u011frulamay\u0131 Kullanma<\/h3>\n<p>FluentValidation'\u0131 yap\u0131land\u0131rd\u0131ktan sonra, kontrolc\u00fclerinizde manuel bir i\u015flem yapman\u0131za gerek kalmaz. ASP.NET Core'un model ba\u011flama (model binding) s\u00fcreci s\u0131ras\u0131nda, gelen model FluentValidation taraf\u0131ndan otomatik olarak do\u011frulan\u0131r. Do\u011frulama hatalar\u0131, <code>ModelState<\/code> koleksiyonuna eklenir ve siz bu hatalar\u0131 kontrol edebilirsiniz.<\/p>\n<pre><code class=\"language-csharp\">\nusing Microsoft.AspNetCore.Mvc;\nusing YourAppName.Models; \/\/ Modelinizin namespace'i\n\npublic class HesapController : Controller\n{\n    [HttpPost]\n    public IActionResult KayitOl(KullaniciKayitModel model)\n    {\n        if (!ModelState.IsValid)\n        {\n            \/\/ ModelState ge\u00e7erli de\u011filse, do\u011frulama hatalar\u0131 var demektir.\n            \/\/ Hatalar\u0131 loglayabilir, kullan\u0131c\u0131ya geri d\u00f6nd\u00fcrebilir veya ba\u015fka i\u015flemler yapabilirsiniz.\n            foreach (var state in ModelState)\n            {\n                foreach (var error in state.Value.Errors)\n                {\n                    Console.WriteLine($\"{state.Key}: {error.ErrorMessage}\");\n                }\n            }\n            return View(model); \/\/ Ya da BadRequest(ModelState) e\u011fer bir API ise\n        }\n\n        \/\/ Model ge\u00e7erliyse, kay\u0131t i\u015flemini tamamla\n        \/\/ ...\n        return RedirectToAction(\"KayitBasarili\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<div class=\"uzman-ipucu\">\n    Uzman \u0130pucu: API projelerinde, <code>[ApiController]<\/code> niteli\u011fi (attribute) kullan\u0131lan kontrolc\u00fclerde <code>ModelState.IsValid<\/code> kontrol\u00fc otomatik olarak yap\u0131l\u0131r ve ge\u00e7ersiz modeller i\u00e7in 400 Bad Request yan\u0131t\u0131 otomatik olarak d\u00f6nd\u00fcr\u00fcl\u00fcr. Bu, API geli\u015ftiricileri i\u00e7in b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar.\n<\/div>\n<p>Bu ad\u0131mlar\u0131 takip ederek FluentValidation'\u0131 ASP.NET Core uygulaman\u0131za ba\u015far\u0131yla entegre edebilir ve veri do\u011frulama s\u00fcre\u00e7lerinizi \u00e7ok daha verimli ve y\u00f6netilebilir hale getirebilirsiniz.<\/p>\n<h2>Karma\u015f\u0131k Senaryolar \u0130\u00e7in FluentValidation: \u0130leri D\u00fczey Kullan\u0131m Teknikleri<\/h2>\n<p>FluentValidation, sadece basit alan do\u011frulamalar\u0131 yapmakla kalmaz, ayn\u0131 zamanda karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 ve ko\u015fullu do\u011frulama senaryolar\u0131n\u0131 da g\u00fc\u00e7l\u00fc bir \u015fekilde ele alman\u0131z\u0131 sa\u011flar. Bu b\u00f6l\u00fcmde, daha deneyimli kullan\u0131c\u0131lar i\u00e7in baz\u0131 ileri d\u00fczey tekniklere ve p\u00fcf noktalar\u0131na odaklanaca\u011f\u0131z.<\/p>\n<h3>Ko\u015fullu Do\u011frulama (Conditional Validation)<\/h3>\n<p>Baz\u0131 durumlarda, bir kural\u0131n yaln\u0131zca belirli ko\u015fullar alt\u0131nda uygulanmas\u0131 gerekebilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n telefon numaras\u0131 alan\u0131, yaln\u0131zca e\u011fer <code>IletisimTercihi<\/code> \u00f6zelli\u011fi 'Telefon' olarak ayarlanm\u0131\u015fsa zorunlu olabilir. FluentValidation, <code>When()<\/code> ve <code>Unless()<\/code> metotlar\u0131 ile ko\u015fullu do\u011frulama yapman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\npublic class IletisimModel\n{\n    public string IletisimTercihi { get; set; } \/\/ \"Email\" veya \"Telefon\"\n    public string EpostaAdresi { get; set; }\n    public string TelefonNumarasi { get; set; }\n}\n\npublic class IletisimValidator : AbstractValidator<IletisimModel>\n{\n    public IletisimValidator()\n    {\n        RuleFor(x => x.EpostaAdresi)\n            .NotEmpty().WithMessage(\"E-posta adresi bo\u015f b\u0131rak\u0131lamaz.\")\n            .EmailAddress().WithMessage(\"Ge\u00e7erli bir e-posta adresi giriniz.\")\n            .When(x => x.IletisimTercihi == \"Email\"); \/\/ Sadece tercih Email ise bu kural uygulan\u0131r\n\n        RuleFor(x => x.TelefonNumarasi)\n            .NotEmpty().WithMessage(\"Telefon numaras\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .Matches(@\"^\\d{10}$\").WithMessage(\"Ge\u00e7erli bir 10 haneli telefon numaras\u0131 giriniz.\")\n            .When(x => x.IletisimTercihi == \"Telefon\"); \/\/ Sadece tercih Telefon ise bu kural uygulan\u0131r\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>Unless()<\/code> ise <code>When()<\/code> metodunun tam tersi \u015fekilde \u00e7al\u0131\u015f\u0131r; belirli bir ko\u015ful do\u011fru <strong>de\u011filse<\/strong> kural\u0131 uygular. Bu sayede, uygulaman\u0131z\u0131n do\u011frulama mant\u0131\u011f\u0131n\u0131 i\u015f ak\u0131\u015f\u0131n\u0131za g\u00f6re hassas bir \u015fekilde ayarlayabilirsiniz.<\/p>\n<h3>\u0130\u00e7 \u0130\u00e7e Do\u011frulama (Nested Validators)<\/h3>\n<p>Uygulamalar genellikle karma\u015f\u0131k veri yap\u0131lar\u0131na sahiptir. Bir model ba\u015fka bir model nesnesini i\u00e7erebilir (\u00f6rne\u011fin, bir Sipari\u015f modelinin i\u00e7inde birden fazla SiparisKalemi nesnesi olmas\u0131). FluentValidation, <code>SetValidator()<\/code> metodu ile i\u00e7 i\u00e7e modelleri do\u011frulamay\u0131 da destekler.<\/p>\n<pre><code class=\"language-csharp\">\npublic class Adres\n{\n    public string Sokak { get; set; }\n    public string Sehir { get; set; }\n    public string PostaKodu { get; set; }\n}\n\npublic class KullaniciProfilModel\n{\n    public string KullaniciAdi { get; set; }\n    public Adres EvAdresi { get; set; }\n}\n\npublic class AdresValidator : AbstractValidator<Adres>\n{\n    public AdresValidator()\n    {\n        RuleFor(adres => adres.Sokak).NotEmpty().WithMessage(\"Sokak bo\u015f b\u0131rak\u0131lamaz.\");\n        RuleFor(adres => adres.Sehir).NotEmpty().WithMessage(\"\u015eehir bo\u015f b\u0131rak\u0131lamaz.\");\n        RuleFor(adres => adres.PostaKodu).NotEmpty().Length(5).WithMessage(\"Ge\u00e7erli bir 5 haneli posta kodu giriniz.\");\n    }\n}\n\npublic class KullaniciProfilValidator : AbstractValidator<KullaniciProfilModel>\n{\n    public KullaniciProfilValidator()\n    {\n        RuleFor(k => k.KullaniciAdi).NotEmpty().WithMessage(\"Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.\");\n        RuleFor(k => k.EvAdresi).SetValidator(new AdresValidator()); \/\/ \u0130\u00e7 i\u00e7e do\u011frulay\u0131c\u0131y\u0131 ayarla\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>KullaniciProfilValidator<\/code> i\u00e7inde <code>EvAdresi<\/code> \u00f6zelli\u011fi i\u00e7in <code>AdresValidator<\/code>'\u0131 kullanarak i\u00e7 i\u00e7e do\u011frulamay\u0131 etkinle\u015ftirdik. Bu sayede, daha k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f do\u011frulay\u0131c\u0131lar olu\u015fturabilir ve bunlar\u0131 karma\u015f\u0131k modellerde yeniden kullanabilirsiniz, bu da kod tekrar\u0131n\u0131 azalt\u0131r ve bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Kural K\u00fcmeleri (Rule Sets)<\/h3>\n<p>Baz\u0131 durumlarda, ayn\u0131 modelin farkl\u0131 senaryolarda farkl\u0131 do\u011frulama kurallar\u0131na sahip olmas\u0131 gerekebilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kay\u0131t a\u015famas\u0131nda belirli kurallar, profil g\u00fcncelleme a\u015famas\u0131nda ise farkl\u0131 kurallar ge\u00e7erli olabilir. FluentValidation, <code>RuleSet()<\/code> ile kural k\u00fcmeleri tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\npublic class UrunModel\n{\n    public int Id { get; set; }\n    public string Ad { get; set; }\n    public decimal Fiyat { get; set; }\n    public int StokAdedi { get; set; }\n}\n\npublic class UrunValidator : AbstractValidator<UrunModel>\n{\n    public UrunValidator()\n    {\n        \/\/ Varsay\u0131lan kural k\u00fcmesi (kural k\u00fcmesi belirtilmedi\u011finde uygulan\u0131r)\n        RuleFor(u => u.Ad).NotEmpty().WithMessage(\"\u00dcr\u00fcn ad\u0131 bo\u015f olamaz.\");\n        RuleFor(u => u.Fiyat).GreaterThan(0).WithMessage(\"Fiyat s\u0131f\u0131rdan b\u00fcy\u00fck olmal\u0131d\u0131r.\");\n\n        \/\/ \"Create\" kural k\u00fcmesi\n        RuleSet(\"Create\", () =>\n        {\n            RuleFor(u => u.Id).Equal(0).WithMessage(\"Yeni \u00fcr\u00fcn olu\u015fturulurken ID de\u011feri olmamal\u0131d\u0131r.\");\n            RuleFor(u => u.StokAdedi).GreaterThanOrEqualTo(0).WithMessage(\"Stok adedi negatif olamaz.\");\n        });\n\n        \/\/ \"Update\" kural k\u00fcmesi\n        RuleSet(\"Update\", () =>\n        {\n            RuleFor(u => u.Id).GreaterThan(0).WithMessage(\"\u00dcr\u00fcn g\u00fcncellenirken ID de\u011feri belirtilmelidir.\");\n            RuleFor(u => u.Ad).Length(3, 100).WithMessage(\"\u00dcr\u00fcn ad\u0131 3-100 karakter aras\u0131nda olmal\u0131d\u0131r.\");\n        });\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bir kontrolc\u00fcde belirli bir kural k\u00fcmesini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, do\u011frulay\u0131c\u0131y\u0131 \u00e7a\u011f\u0131r\u0131rken <code>RuleSet<\/code> parametresini belirtebilirsiniz:<\/p>\n<pre><code class=\"language-csharp\">\npublic class UrunController : Controller\n{\n    private readonly IValidator<UrunModel> _urunValidator;\n\n    public UrunController(IValidator<UrunModel> urunValidator)\n    {\n        _urunValidator = urunValidator;\n    }\n\n    [HttpPost(\"create\")]\n    public IActionResult UrunOlustur([FromBody] UrunModel model)\n    {\n        var result = _urunValidator.Validate(model, options => options.IncludeRuleSets(\"Create\"));\n        if (!result.IsValid)\n        {\n            return BadRequest(result.Errors);\n        }\n        \/\/ ... \u00dcr\u00fcn olu\u015fturma i\u015flemleri\n        return Ok(\"\u00dcr\u00fcn ba\u015far\u0131yla olu\u015fturuldu.\");\n    }\n\n    [HttpPut(\"update\")]\n    public IActionResult UrunGuncelle([FromBody] UrunModel model)\n    {\n        var result = _urunValidator.Validate(model, options => options.IncludeRuleSets(\"Update\"));\n        if (!result.IsValid)\n        {\n            return BadRequest(result.Errors);\n        }\n        \/\/ ... \u00dcr\u00fcn g\u00fcncelleme i\u015flemleri\n        return Ok(\"\u00dcr\u00fcn ba\u015far\u0131yla g\u00fcncellendi.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ileri d\u00fczey \u00f6zellikler, FluentValidation'\u0131n karma\u015f\u0131k i\u015f gereksinimlerini kar\u015f\u0131lamada ne kadar esnek ve g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6stermektedir. Bu teknikleri ustaca kullanarak, daha mod\u00fcler, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay do\u011frulama katmanlar\u0131 olu\u015fturabilirsiniz.<\/p>\n<h2>\u00d6zel Do\u011frulay\u0131c\u0131lar ve Asenkron Do\u011frulama: Esneklik Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>FluentValidation'\u0131n sundu\u011fu yerle\u015fik do\u011frulama kurallar\u0131 \u00e7o\u011fu senaryo i\u00e7in yeterli olsa da, bazen i\u015f mant\u0131\u011f\u0131n\u0131z\u0131n gerektirdi\u011fi benzersiz kontrolleri uygulamak i\u00e7in \u00f6zel do\u011frulay\u0131c\u0131lara veya harici kaynaklara (veritaban\u0131, API) eri\u015fim gerektiren asenkron do\u011frulamalara ihtiyac\u0131n\u0131z olabilir. Bu b\u00f6l\u00fcmde, bu senaryolar\u0131 nas\u0131l ele alaca\u011f\u0131n\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h3>\u00d6zel Do\u011frulay\u0131c\u0131lar (Custom Validators) Olu\u015fturma<\/h3>\n<p>FluentValidation, yerle\u015fik kurallar\u0131n\u0131n \u00f6tesine ge\u00e7menizi sa\u011flayan \u00e7e\u015fitli yollar sunar. En basit yol, <code>Must()<\/code> metodunu kullanarak kendi do\u011frulama mant\u0131\u011f\u0131n\u0131z\u0131 do\u011frudan bir kural i\u00e7inde tan\u0131mlamakt\u0131r. Daha karma\u015f\u0131k ve yeniden kullan\u0131labilir bir do\u011frulama i\u00e7in, \u00f6zel bir kural uzant\u0131s\u0131 veya \u00f6zel bir <code>PropertyValidator<\/code> t\u00fcrevi olu\u015fturabilirsiniz.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Do\u011frudan kural i\u00e7inde \u00f6zel mant\u0131k\npublic class KullaniciValidatorWithCustomLogic : AbstractValidator<KullaniciModel>\n{\n    public KullaniciValidatorWithCustomLogic()\n    {\n        RuleFor(k => k.Sifre)\n            .Must(sifre => SifreGucunuKontrolEt(sifre))\n            .WithMessage(\"\u015eifre en az bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve bir \u00f6zel karakter i\u00e7ermelidir.\");\n    }\n\n    private bool SifreGucunuKontrolEt(string sifre)\n    {\n        \/\/ Burada kendi \u015fifre karma\u015f\u0131kl\u0131k mant\u0131\u011f\u0131n\u0131z\u0131 uygulay\u0131n\n        \/\/ \u00d6rnek: regex kullanarak kontrol\n        return sifre != null && Regex.IsMatch(sifre, @\"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).{8,}$\");\n    }\n}\n\n\/\/ \u00d6zel kural uzant\u0131s\u0131 olarak yeniden kullan\u0131labilir do\u011frulay\u0131c\u0131\npublic static class CustomValidatorExtensions\n{\n    public static IRuleBuilder<T, string> SifreGucuneSahip<T>(this IRuleBuilder<T, string> ruleBuilder)\n    {\n        return ruleBuilder.Must(sifre =>\n        {\n            \/\/ Daha karma\u015f\u0131k \u015fifre g\u00fcc\u00fc kontrol\u00fc\n            return sifre != null && Regex.IsMatch(sifre, @\"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).{8,}$\");\n        }).WithMessage(\"\u015eifre zay\u0131f. En az 8 karakter, b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf, rakam ve \u00f6zel karakter i\u00e7ermelidir.\");\n    }\n}\n\n\/\/ Kullan\u0131m\npublic class KullaniciValidatorWithExtension : AbstractValidator<KullaniciModel>\n{\n    public KullaniciValidatorWithExtension()\n    {\n        RuleFor(k => k.Sifre).SifreGucuneSahip(); \/\/ Kendi uzant\u0131 metodumuzu kullan\u0131yoruz\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6zel uzant\u0131 metotlar\u0131, s\u0131k\u00e7a kullan\u0131lan karma\u015f\u0131k do\u011frulama mant\u0131klar\u0131n\u0131 soyutlaman\u0131za ve kod tekrar\u0131n\u0131 \u00f6nlemenize yard\u0131mc\u0131 olur. Bu, kod taban\u0131n\u0131z\u0131n daha temiz ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Asenkron Do\u011frulama (Asynchronous Validation)<\/h3>\n<p>Bazen do\u011frulama i\u015flemleri, bir veritaban\u0131 sorgusu veya harici bir API \u00e7a\u011fr\u0131s\u0131 gibi zaman al\u0131c\u0131 operasyonlar gerektirebilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kaydolurken girdi\u011fi e-posta adresinin veritaban\u0131nda daha \u00f6nce kullan\u0131l\u0131p kullan\u0131lmad\u0131\u011f\u0131n\u0131 kontrol etmek. Bu t\u00fcr senaryolar i\u00e7in FluentValidation, asenkron do\u011frulama deste\u011fi sunar.<\/p>\n<p><code>MustAsync()<\/code> metodu, <code>Task<bool><\/code> d\u00f6nd\u00fcren bir lambda ifadesi veya metot ile kullan\u0131labilir. Bu, I\/O yo\u011fun i\u015flemlerin ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (thread) bloke etmeden ger\u00e7ekle\u015ftirilmesini sa\u011flar.<\/p>\n<pre><code class=\"language-csharp\">\npublic class YeniKullaniciModel\n{\n    public string Eposta { get; set; }\n    public string KullaniciAdi { get; set; }\n}\n\npublic interface IKullaniciServisi\n{\n    Task<bool> EpostaMevcutMu(string eposta);\n    Task<bool> KullaniciAdiMevcutMu(string kullaniciAdi);\n}\n\npublic class YeniKullaniciValidator : AbstractValidator<YeniKullaniciModel>\n{\n    public YeniKullaniciValidator(IKullaniciServisi kullaniciServisi)\n    {\n        RuleFor(k => k.Eposta)\n            .NotEmpty().WithMessage(\"E-posta bo\u015f b\u0131rak\u0131lamaz.\")\n            .EmailAddress().WithMessage(\"Ge\u00e7erli bir e-posta adresi giriniz.\")\n            .MustAsync(async (eposta, cancellation) => !await kullaniciServisi.EpostaMevcutMu(eposta))\n            .WithMessage(\"Bu e-posta adresi zaten kullan\u0131mda.\");\n\n        RuleFor(k => k.KullaniciAdi)\n            .NotEmpty().WithMessage(\"Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .MustAsync(async (kullaniciAdi, cancellation) => !await kullaniciServisi.KullaniciAdiMevcutMu(kullaniciAdi))\n            .WithMessage(\"Bu kullan\u0131c\u0131 ad\u0131 zaten al\u0131nm\u0131\u015f.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>YeniKullaniciValidator<\/code>, DI arac\u0131l\u0131\u011f\u0131yla bir <code>IKullaniciServisi<\/code> almaktad\u0131r. Bu servis, veritaban\u0131 sorgular\u0131n\u0131 veya API \u00e7a\u011fr\u0131lar\u0131n\u0131 sim\u00fcle eden asenkron metotlara sahiptir. <code>MustAsync()<\/code> metodu, e-posta ve kullan\u0131c\u0131 ad\u0131n\u0131n sistemde mevcut olup olmad\u0131\u011f\u0131n\u0131 asenkron olarak kontrol eder. Bu yap\u0131, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve yan\u0131t verebilirli\u011fini korurken karma\u015f\u0131k i\u015f kurallar\u0131n\u0131 uygulaman\u0131za olanak tan\u0131r.<\/p>\n<div class=\"uzman-ipucu\">\n    Uzman \u0130pucu: Asenkron do\u011frulama kullan\u0131rken, performans etkisini g\u00f6z \u00f6n\u00fcnde bulundurun. Her do\u011frulama kural\u0131n\u0131n asenkron olmamas\u0131 gerekir. Yaln\u0131zca I\/O veya a\u011f i\u015flemleri i\u00e7eren do\u011frulama kurallar\u0131 i\u00e7in <code>MustAsync<\/code> kullan\u0131n. Ayr\u0131ca, cancellation token'\u0131 do\u011fru bir \u015fekilde y\u00f6netmek, uzun s\u00fcren i\u015flemlerin iptal edilmesini sa\u011flayarak kaynak israf\u0131n\u0131 \u00f6nler.\n<\/div>\n<p>\u00d6zel do\u011frulay\u0131c\u0131lar ve asenkron do\u011frulama yetenekleri sayesinde FluentValidation, uygulaman\u0131z\u0131n do\u011frulama ihtiya\u00e7lar\u0131na tam olarak uyum sa\u011flayabilir. Bu esneklik, geli\u015ftiricilere karma\u015f\u0131k ve performans gerektiren senaryolarda bile g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler \u00fcretme imkan\u0131 sunar.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir API Projesinde FluentValidation ile Kullan\u0131c\u0131 Kayd\u0131 Do\u011frulamas\u0131<\/h2>\n<p>Bu b\u00f6l\u00fcmde, FluentValidation'\u0131 ger\u00e7ek bir ASP.NET Core Web API projesinde, kullan\u0131c\u0131 kay\u0131t i\u015flemi s\u0131ras\u0131nda veri do\u011frulama amac\u0131yla nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu senaryo, tipik bir API geli\u015ftirme s\u00fcrecindeki yayg\u0131n do\u011frulama ihtiya\u00e7lar\u0131n\u0131 kapsayacakt\u0131r.<\/p>\n<h3>Senaryo: Yeni Kullan\u0131c\u0131 Kay\u0131t API'si<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131n arka ucu i\u00e7in yeni bir kullan\u0131c\u0131 kay\u0131t API'si geli\u015ftirdi\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Kullan\u0131c\u0131lardan ad, soyad, e-posta ve \u015fifre gibi bilgileri al\u0131yorsunuz. Bu bilgilerin belirli kurallara g\u00f6re do\u011frulanmas\u0131 gerekiyor:<\/p>\n<ul>\n<li>Ad ve Soyad bo\u015f olmamal\u0131, belirli bir uzunlukta olmal\u0131.<\/li>\n<li>E-posta adresi bo\u015f olmamal\u0131, ge\u00e7erli formatta olmal\u0131 ve veritaban\u0131nda daha \u00f6nce kullan\u0131lmam\u0131\u015f olmal\u0131 (benzersizlik).<\/li>\n<li>\u015eifre bo\u015f olmamal\u0131, minimum uzunlukta olmal\u0131, en az bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve bir \u00f6zel karakter i\u00e7ermeli.<\/li>\n<li>\u015eifre tekrar\u0131, \u015fifre ile e\u015fle\u015fmeli.<\/li>\n<\/ul>\n<h3>Ad\u0131m 1: DTO (Data Transfer Object) Tan\u0131mlama<\/h3>\n<p>API'ye gelen veriyi temsil etmek i\u00e7in bir DTO (Data Transfer Object) olu\u015ftural\u0131m. Bu DTO, istemciden bekledi\u011fimiz alanlar\u0131 i\u00e7erecektir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Models\/KullaniciKayitDTO.cs\npublic class KullaniciKayitDTO\n{\n    public string Ad { get; set; }\n    public string Soyad { get; set; }\n    public string Eposta { get; set; }\n    public string Sifre { get; set; }\n    public string SifreTekrar { get; set; }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Ad\u0131m 2: Kullan\u0131c\u0131 Servisi Olu\u015fturma (E-posta Benzersizli\u011fi \u0130\u00e7in)<\/h3>\n<p>E-posta benzersizli\u011fi kontrol\u00fcn\u00fc sim\u00fcle etmek i\u00e7in basit bir servis aray\u00fcz\u00fc ve uygulamas\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Services\/IKullaniciRepository.cs\npublic interface IKullaniciRepository\n{\n    Task<bool> EpostaVarMi(string eposta);\n}\n\n\/\/ Services\/KullaniciRepository.cs\npublic class KullaniciRepository : IKullaniciRepository\n{\n    \/\/ Ger\u00e7ek bir uygulamada bu veritaban\u0131 sorgusu yapard\u0131.\n    \/\/ \u015eimdilik sadece \u00f6rnek ama\u00e7l\u0131 baz\u0131 e-postalar\u0131 \"kullan\u0131mda\" olarak i\u015faretleyelim.\n    private readonly List<string> _mevcutEpostalar = new List<string> { \"test@example.com\", \"admin@example.com\" };\n\n    public async Task<bool> EpostaVarMi(string eposta)\n    {\n        await Task.Delay(100); \/\/ Asenkron bir i\u015flemi sim\u00fcle et\n        return _mevcutEpostalar.Contains(eposta.ToLower());\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Ad\u0131m 3: FluentValidation Do\u011frulay\u0131c\u0131s\u0131n\u0131 Tan\u0131mlama<\/h3>\n<p>\u015eimdi <code>KullaniciKayitDTO<\/code> i\u00e7in t\u00fcm do\u011frulama kurallar\u0131n\u0131 i\u00e7eren <code>KullaniciKayitValidator<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Validators\/KullaniciKayitValidator.cs\nusing FluentValidation;\nusing System.Text.RegularExpressions;\nusing YourAppName.Models;\nusing YourAppName.Services; \/\/ IKullaniciRepository i\u00e7in\n\npublic class KullaniciKayitValidator : AbstractValidator<KullaniciKayitDTO>\n{\n    private readonly IKullaniciRepository _kullaniciRepository;\n\n    public KullaniciKayitValidator(IKullaniciRepository kullaniciRepository)\n    {\n        _kullaniciRepository = kullaniciRepository;\n\n        RuleFor(x => x.Ad)\n            .NotEmpty().WithMessage(\"Ad alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .Length(2, 50).WithMessage(\"Ad en az 2, en fazla 50 karakter olmal\u0131d\u0131r.\");\n\n        RuleFor(x => x.Soyad)\n            .NotEmpty().WithMessage(\"Soyad alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .Length(2, 50).WithMessage(\"Soyad en az 2, en fazla 50 karakter olmal\u0131d\u0131r.\");\n\n        RuleFor(x => x.Eposta)\n            .NotEmpty().WithMessage(\"E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .EmailAddress().WithMessage(\"Ge\u00e7erli bir e-posta adresi giriniz.\")\n            .MustAsync(async (eposta, cancellation) => !await _kullaniciRepository.EpostaVarMi(eposta))\n            .WithMessage(\"Bu e-posta adresi zaten kullan\u0131mda.\");\n\n        RuleFor(x => x.Sifre)\n            .NotEmpty().WithMessage(\"\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\n            .MinimumLength(8).WithMessage(\"\u015eifre en az 8 karakter olmal\u0131d\u0131r.\")\n            .Must(sifre => Regex.IsMatch(sifre, @\"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).{8,}$\"))\n            .WithMessage(\"\u015eifre en az bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve bir \u00f6zel karakter i\u00e7ermelidir.\");\n\n        RuleFor(x => x.SifreTekrar)\n            .Equal(x => x.Sifre).WithMessage(\"\u015eifreler e\u015fle\u015fmiyor.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Ad\u0131m 4: Startup Yap\u0131land\u0131rmas\u0131 ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu<\/h3>\n<p><code>Program.cs<\/code> dosyas\u0131nda, FluentValidation'\u0131 ve <code>IKullaniciRepository<\/code> servislerimizi kaydedelim.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nusing FluentValidation;\nusing FluentValidation.AspNetCore;\nusing YourAppName.Services;\nusing YourAppName.Validators; \/\/ KullaniciKayitValidator i\u00e7in\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ API kontrolc\u00fclerini ekle\nbuilder.Services.AddControllers();\n\n\/\/ Servisleri ekle\nbuilder.Services.AddScoped<IKullaniciRepository, KullaniciRepository>();\n\n\/\/ FluentValidation entegrasyonu\nbuilder.Services.AddFluentValidationAutoValidation();\nbuilder.Services.AddValidatorsFromAssemblyContaining<KullaniciKayitValidator>(); \/\/ T\u00fcm do\u011frulay\u0131c\u0131lar\u0131 kaydet\n\n\/\/ ... di\u011fer servisler\n\nvar app = builder.Build();\n\n\/\/ Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.UseDeveloperExceptionPage();\n}\n\napp.UseRouting();\napp.UseAuthorization();\napp.MapControllers();\n\napp.Run();\n<\/pre>\n<p><\/code><\/p>\n<h3>Ad\u0131m 5: API Kontrolc\u00fcs\u00fcn\u00fc Olu\u015fturma<\/h3>\n<p>Son olarak, kullan\u0131c\u0131 kay\u0131t iste\u011fini i\u015fleyecek olan API kontrolc\u00fcs\u00fcn\u00fc olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Controllers\/HesapController.cs\nusing Microsoft.AspNetCore.Mvc;\nusing YourAppName.Models;\nusing System.Threading.Tasks;\n\n[ApiController]\n[Route(\"api\/[controller]\")]\npublic class HesapController : ControllerBase\n{\n    \/\/ [ApiController] niteli\u011fi sayesinde ModelState.IsValid kontrol\u00fcn\u00fc otomatik yap\u0131yor.\n    \/\/ Manual kontrol yapmaya gerek kalm\u0131yor.\n\n    [HttpPost(\"kayitol\")]\n    public async Task<IActionResult> KayitOl([FromBody] KullaniciKayitDTO model)\n    {\n        \/\/ FluentValidation taraf\u0131ndan otomatik olarak do\u011frulanacak.\n        \/\/ E\u011fer ModelState ge\u00e7erli de\u011filse, [ApiController] otomatik olarak 400 Bad Request d\u00f6necektir.\n        \/\/ Hata detaylar\u0131 JSON olarak g\u00f6nderilecektir.\n\n        \/\/ Model ge\u00e7erliyse kay\u0131t i\u015flemini sim\u00fcle edelim.\n        \/\/ Ger\u00e7ek bir uygulamada, burada KullaniciKayitDTO'yu Kullanici entity'sine d\u00f6n\u00fc\u015ft\u00fcr\u00fcp\n        \/\/ veritaban\u0131na kaydetme, e-posta onay\u0131 g\u00f6nderme vb. i\u015flemler yap\u0131l\u0131r.\n\n        await Task.Delay(100); \/\/ Kay\u0131t i\u015flemini sim\u00fcle et\n\n        return Ok(new { Mesaj = \"Kullan\u0131c\u0131 ba\u015far\u0131yla kaydedildi.\", KullaniciAdi = model.Ad, Eposta = model.Eposta });\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ger\u00e7ek d\u00fcnya senaryosunda, FluentValidation'\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, asenkron do\u011frulamay\u0131 ve <code>[ApiController]<\/code> niteli\u011fi ile otomatik hata y\u00f6netiminin API projelerinde ne kadar faydal\u0131 oldu\u011funu g\u00f6rd\u00fck. Bu yakla\u015f\u0131m, API'lerinizin sa\u011flam, g\u00fcvenilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Mobil Uyumlu Form Do\u011frulamas\u0131: Duyarl\u0131 Tasar\u0131m \u0130pu\u00e7lar\u0131<\/h2>\n<p>Modern web uygulamalar\u0131nda, kullan\u0131c\u0131 deneyimi mobil cihazlarda da kusursuz olmal\u0131d\u0131r. Form do\u011frulama, mobil kullan\u0131c\u0131lar i\u00e7in \u00f6zellikle kritik bir rol oynar, \u00e7\u00fcnk\u00fc k\u00fc\u00e7\u00fck ekranlarda hata mesajlar\u0131n\u0131n g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 daha da \u00f6nemlidir. FluentValidation do\u011frudan mobil uyumlu CSS veya JavaScript \u00fcretmese de, onunla birlikte \u00e7al\u0131\u015fan \u00f6n y\u00fcz (front-end) kodunuzu nas\u0131l tasarlayaca\u011f\u0131n\u0131z konusunda baz\u0131 \u00f6nemli ipu\u00e7lar\u0131 vard\u0131r.<\/p>\n<h3>Do\u011frulama Hata Mesajlar\u0131n\u0131n G\u00f6rsel Sunumu<\/h3>\n<p>Mobil cihazlarda, do\u011frulama hata mesajlar\u0131n\u0131n ekran\u0131 kaplamamas\u0131, ancak a\u00e7\u0131k\u00e7a g\u00f6r\u00fcn\u00fcr olmas\u0131 gerekir. Genellikle, hatal\u0131 giri\u015f alan\u0131n\u0131n hemen alt\u0131nda, k\u00fc\u00e7\u00fck ve okunabilir bir yaz\u0131 tipiyle mesajlar\u0131 g\u00f6stermek en iyi yakla\u015f\u0131md\u0131r. Ayr\u0131ca, hatal\u0131 alanlar\u0131 g\u00f6rsel olarak vurgulamak (\u00f6rne\u011fin, k\u0131rm\u0131z\u0131 bir \u00e7er\u00e7eveyle) kullan\u0131c\u0131lar\u0131n hatay\u0131 h\u0131zl\u0131ca fark etmesini sa\u011flar.<\/p>\n<p>FluentValidation, API'nizde veya MVC uygulaman\u0131zda standart <code>ModelState<\/code> mekanizmas\u0131n\u0131 kulland\u0131\u011f\u0131 i\u00e7in, istemci taraf\u0131nda bu hatalar\u0131 yakalay\u0131p uygun \u015fekilde g\u00f6r\u00fcnt\u00fclemek sizin front-end kodunuza kalm\u0131\u015ft\u0131r. JavaScript ile bu hatalar\u0131 i\u015fleyip DOM'a yerle\u015ftirebilirsiniz.<\/p>\n<h3>\u0130stemci Taraf\u0131 Do\u011frulama ve Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Sunucu taraf\u0131 do\u011frulama her zaman son g\u00fcvenlik katman\u0131 olsa da, istemci taraf\u0131 do\u011frulama (JavaScript ile), kullan\u0131c\u0131lar\u0131n hatalar\u0131 an\u0131nda d\u00fczeltmesine olanak tan\u0131r ve gereksiz sunucu gidi\u015f-d\u00f6n\u00fc\u015flerini azalt\u0131r. Bu, \u00f6zellikle mobil a\u011f ba\u011flant\u0131lar\u0131n\u0131n yava\u015f olabilece\u011fi durumlarda kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<p>FluentValidation.AspNetCore paketi, belirli FluentValidation kurallar\u0131n\u0131 (<code>NotEmpty<\/code>, <code>EmailAddress<\/code>, <code>Length<\/code> gibi) HTML5 ve jQuery Validate gibi istemci taraf\u0131 do\u011frulama k\u00fct\u00fcphaneleriyle uyumlu adapt\u00f6rler sa\u011flar. Bu, sunucu taraf\u0131nda tan\u0131mlad\u0131\u011f\u0131n\u0131z kurallar\u0131n bir k\u0131sm\u0131n\u0131n otomatik olarak istemci taraf\u0131nda da \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r.<\/p>\n<pre><code class=\"language-html\">\n<!-- HTML form \u00f6rne\u011fi -->\n<form asp-controller=\"Hesap\" asp-action=\"KayitOl\" method=\"post\">\n    <div class=\"form-group\">\n        <label asp-for=\"Eposta\">E-posta<\/label>\n        <input asp-for=\"Eposta\" class=\"form-control\" \/>\n        <span asp-validation-for=\"Eposta\" class=\"text-danger\"><\/span>\n    <\/div>\n    <!-- Di\u011fer alanlar -->\n    <button type=\"submit\" class=\"btn btn-primary\">Kaydol<\/button>\n<\/form>\n\n<!-- jQuery Validate ve FluentValidation adapt\u00f6rlerini etkinle\u015ftirmek i\u00e7in -->\n<script src=\"~\/lib\/jquery-validation\/dist\/jquery.validate.min.js\"><\/script>\n<script src=\"~\/lib\/jquery-validation-unobtrusive\/jquery.validate.unobtrusive.min.js\"><\/script>\n<script src=\"~\/js\/fluentvalidation-unobtrusive.js\"><\/script> <!-- FluentValidation.AspNetCore paketi ile gelir -->\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki HTML ve JavaScript referanslar\u0131 ile, FluentValidation'\u0131n sunucu taraf\u0131 kurallar\u0131n\u0131n bir k\u0131sm\u0131 istemci taraf\u0131nda da \u00e7al\u0131\u015facakt\u0131r. Ancak, t\u00fcm karma\u015f\u0131k FluentValidation kurallar\u0131 (\u00f6rne\u011fin, <code>MustAsync<\/code> ile veritaban\u0131 kontrol\u00fc veya \u00f6zel regex'ler) istemci taraf\u0131nda otomatik olarak desteklenmez. Bu gibi durumlarda, manuel JavaScript do\u011frulama yazman\u0131z gerekebilir veya kullan\u0131c\u0131lar\u0131n bu t\u00fcr hatalar\u0131 sunucuya g\u00f6nderdikten sonra g\u00f6rmelerini bekleyebilirsiniz.<\/p>\n<h3>Duyarl\u0131 Tasar\u0131m ile Hata Mesaj\u0131 Konumland\u0131rma<\/h3>\n<p>Hata mesajlar\u0131n\u0131n mobil cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnmesi i\u00e7in CSS media query'lerini kullanarak farkl\u0131 ekran boyutlar\u0131na g\u00f6re stil ayarlamalar\u0131 yapabilirsiniz. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda hata mesajlar\u0131n\u0131n daha az yer kaplamas\u0131n\u0131 veya farkl\u0131 bir konumda g\u00f6r\u00fcnmesini sa\u011flayabilirsiniz.<\/p>\n<pre><code class=\"language-css\">\n\/* Genel hata mesaj\u0131 stili *\/\n.text-danger {\n    color: #dc3545;\n    font-size: 0.875em;\n    margin-top: 0.25rem;\n}\n\n\/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in d\u00fczenlemeler *\/\n@media (max-width: 768px) {\n    .text-danger {\n        font-size: 0.8em; \/* Daha k\u00fc\u00e7\u00fck font *\/\n        position: relative; \/* Pozisyonu ayarla *\/\n        left: 0;\n        right: 0;\n        text-align: left; \/* Metni sola hizala *\/\n    }\n\n    .form-group input.input-validation-error {\n        border-color: #dc3545;\n        padding-right: 2.25rem; \/* Hata ikonu i\u00e7in yer a\u00e7 *\/\n        background-image: url(\"data:image\/svg+xml,...\"); \/* Hata ikonu *\/\n        background-repeat: no-repeat;\n        background-position: right calc(0.375em + 0.1875rem) center;\n        background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu CSS snippet'i, mobil ekran boyutlar\u0131 i\u00e7in hata mesajlar\u0131n\u0131n font boyutunu ayarl\u0131yor ve ayr\u0131ca hatal\u0131 giri\u015f alanlar\u0131na \u00f6zel bir hata ikonu ekleyerek g\u00f6rsel geri bildirimi g\u00fc\u00e7lendiriyor. Bu t\u00fcr duyarl\u0131 tasar\u0131m yakla\u015f\u0131mlar\u0131, mobil kullan\u0131c\u0131lar\u0131n formlar\u0131 daha rahat doldurmas\u0131n\u0131 ve hatalarla daha kolay ba\u015fa \u00e7\u0131kmas\u0131n\u0131 sa\u011flar. FluentValidation'\u0131n g\u00fcc\u00fcn\u00fc, iyi tasarlanm\u0131\u015f bir \u00f6n y\u00fcz ile birle\u015ftirerek, her cihazda sorunsuz bir kullan\u0131c\u0131 deneyimi sunabilirsiniz.<\/p>\n<h2>Sonu\u00e7: FluentValidation ile G\u00fcvenli ve G\u00fcvenilir Uygulamalar<\/h2>\n<p>ASP.NET Core uygulamalar\u0131nda veri do\u011frulama, uygulaman\u0131n g\u00fcvenli\u011fi, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan vazge\u00e7ilmez bir s\u00fcre\u00e7tir. FluentValidation, bu s\u00fcreci basitle\u015ftiren, okunabilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131ran g\u00fc\u00e7l\u00fc ve esnek bir k\u00fct\u00fcphane olarak \u00f6ne \u00e7\u0131kar. Geleneksel Data Annotations'\u0131n \u00f6tesine ge\u00e7erek, do\u011frulama kurallar\u0131n\u0131 ayr\u0131 bir katmanda tutma, ak\u0131c\u0131 API ile kolayca tan\u0131mlama, ko\u015fullu ve i\u00e7 i\u00e7e do\u011frulama gibi ileri d\u00fczey yetenekler sunar. Asenkron do\u011frulama ve \u00f6zel kurallarla i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 tam olarak yans\u0131tma yetene\u011fi, onu b\u00fcy\u00fck ve karma\u015f\u0131k projeler i\u00e7in ideal bir \u00e7\u00f6z\u00fcm haline getirir.<\/p>\n<p>Bu makalede, FluentValidation'\u0131n temel kavramlar\u0131ndan ba\u015flayarak, ASP.NET Core uygulamalar\u0131na nas\u0131l entegre edilece\u011fini, karma\u015f\u0131k senaryolar i\u00e7in ileri d\u00fczey tekniklerini, \u00f6zel ve asenkron do\u011frulama mekanizmalar\u0131n\u0131 ve son olarak ger\u00e7ek d\u00fcnya bir API projesinde kullan\u0131m\u0131n\u0131 ve mobil uyumlu tasar\u0131m ipu\u00e7lar\u0131n\u0131 ele ald\u0131k. FluentValidation'\u0131 projelerinize dahil ederek, sadece ge\u00e7erli verilerle \u00e7al\u0131\u015fman\u0131z\u0131 garanti alt\u0131na almakla kalmaz, ayn\u0131 zamanda daha temiz, test edilebilir ve bak\u0131m\u0131 kolay bir kod taban\u0131 olu\u015fturursunuz. Unutmay\u0131n, iyi bir do\u011frulama stratejisi, uygulaman\u0131z\u0131n kalitesinin ve g\u00fcvenilirli\u011finin temelini olu\u015fturur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<table class=\"faq-table\">\n<thead>\n<tr>\n<th>Soru<\/th>\n<th>Cevap<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>FluentValidation'\u0131 Data Annotations ile birlikte kullanabilir miyim?<\/strong><\/td>\n<td>Evet, kullanabilirsiniz ancak genellikle \u00f6nerilmez. Her iki do\u011frulama mekanizmas\u0131n\u0131n ayn\u0131 model \u00fczerinde \u00e7al\u0131\u015fmas\u0131 beklenmeyen davran\u0131\u015flara yol a\u00e7abilir veya karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131rabilir. Genellikle projenin tamam\u0131nda tek bir do\u011frulama yakla\u015f\u0131m\u0131 (FluentValidation veya Data Annotations) kullanmak daha iyidir. FluentValidation, <code>AddFluentValidationAutoValidation()<\/code> metodu ile ASP.NET Core'un varsay\u0131lan do\u011frulama sa\u011flay\u0131c\u0131s\u0131n\u0131 de\u011fi\u015ftirdi\u011fi i\u00e7in, Data Annotations do\u011frulay\u0131c\u0131lar\u0131 devre d\u0131\u015f\u0131 kalabilir veya \u00f6ncelik sorunlar\u0131 ya\u015fanabilir.<\/td>\n<\/tr>\n<tr>\n<td><strong>FluentValidation ile performans sorunlar\u0131 ya\u015far m\u0131y\u0131m?<\/strong><\/td>\n<td>Genel olarak hay\u0131r. FluentValidation olduk\u00e7a optimize edilmi\u015ftir. Do\u011frulay\u0131c\u0131lar bir kez olu\u015fturulur ve tekrar tekrar kullan\u0131l\u0131r. Ancak, a\u015f\u0131r\u0131 karma\u015f\u0131k \u00f6zel kurallar veya her istekte \u00e7ok say\u0131da I\/O i\u015flemi (\u00f6rne\u011fin veritaban\u0131 \u00e7a\u011fr\u0131lar\u0131) gerektiren <code>MustAsync<\/code> kullan\u0131mlar\u0131 performans\u0131 etkileyebilir. Bu t\u00fcr durumlarda, do\u011frulama mant\u0131\u011f\u0131n\u0131z\u0131 optimize etmek ve m\u00fcmk\u00fcnse \u00f6nbelle\u011fe alma stratejilerini kullanmak \u00f6nemlidir.<\/td>\n<\/tr>\n<tr>\n<td><strong>Farkl\u0131 DTO'lar i\u00e7in ayn\u0131 do\u011frulay\u0131c\u0131y\u0131 kullanabilir miyim?<\/strong><\/td>\n<td>Hay\u0131r, her <code>AbstractValidator<T><\/code> s\u0131n\u0131f\u0131 belirli bir <code>T<\/code> tipi i\u00e7in \u00f6zelle\u015ftirilmi\u015ftir. Farkl\u0131 DTO'lar i\u00e7in farkl\u0131 do\u011frulay\u0131c\u0131lar tan\u0131mlaman\u0131z gerekir. Ancak, ortak do\u011frulama mant\u0131\u011f\u0131n\u0131 yeniden kullan\u0131labilir uzant\u0131 metotlar\u0131 (<code>CustomValidatorExtensions<\/code> \u00f6rne\u011findeki gibi) veya ortak bir soyut do\u011frulay\u0131c\u0131 s\u0131n\u0131f\u0131 olu\u015fturarak payla\u015fabilirsiniz. B\u00f6ylece kod tekrar\u0131n\u0131 en aza indirirsiniz.<\/td>\n<\/tr>\n<tr>\n<td><strong>Hata mesajlar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcnde nas\u0131l g\u00f6sterebilirim?<\/strong><\/td>\n<td>API projelerinde, FluentValidation hatalar\u0131 standart <code>ModelState<\/code> mekanizmas\u0131 arac\u0131l\u0131\u011f\u0131yla JSON format\u0131nda d\u00f6nd\u00fcr\u00fcl\u00fcr (<code>400 Bad Request<\/code> ile). \u0130stemci taraf\u0131nda (\u00f6rne\u011fin JavaScript ile), bu JSON yan\u0131t\u0131n\u0131 ayr\u0131\u015ft\u0131rarak hatalar\u0131 ilgili form alanlar\u0131n\u0131n yan\u0131nda veya bir \u00f6zet listesi halinde g\u00f6r\u00fcnt\u00fcleyebilirsiniz. MVC projelerinde ise <code><span asp-validation-for=\"...\"><\/span><\/code> ve <code><\/p>\n<div asp-validation-summary=\"All\"><\/div>\n<p><\/code> gibi etiket yard\u0131mc\u0131lar\u0131 (tag helpers) kullan\u0131larak hatalar otomatik olarak i\u015flenebilir.<\/td>\n<\/tr>\n<tr>\n<td><strong>FluentValidation ile client-side do\u011frulama yapabilir miyim?<\/strong><\/td>\n<td>Evet, <code>FluentValidation.AspNetCore<\/code> paketi, baz\u0131 yerle\u015fik FluentValidation kurallar\u0131 i\u00e7in istemci taraf\u0131 (unobtrusive) do\u011frulama adapt\u00f6rleri sa\u011flar. <code>AddFluentValidationClientsideAdapters()<\/code> metodunu eklemeniz ve jQuery Validation Unobtrusive JavaScript k\u00fct\u00fcphanesini \u00f6n y\u00fczde kullanman\u0131z gerekir. Ancak, t\u00fcm sunucu taraf\u0131 FluentValidation kurallar\u0131 (\u00f6zellikle \u00f6zel veya asenkron olanlar) otomatik olarak istemci taraf\u0131na aktar\u0131lamaz; bu t\u00fcr durumlar i\u00e7in manuel JavaScript do\u011frulama gerekebilir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1340],"tags":[],"class_list":{"0":"post-31049","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-net","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ASP.NET Core&#039;da FluentValidation ile Veri Do\u011frulama Sanat\u0131<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation&#039;\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASP.NET Core&#039;da FluentValidation ile Veri Do\u011frulama Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation&#039;\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-05T01:01:31+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"ASP.NET Core&#8217;da FluentValidation ile Veri Do\u011frulama Sanat\u0131\",\"datePublished\":\"2025-10-05T01:01:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\"},\"wordCount\":4009,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\".NET\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\",\"name\":\"ASP.NET Core'da FluentValidation ile Veri Do\u011frulama Sanat\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-05T01:01:31+00:00\",\"description\":\"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation'\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ASP.NET Core&#8217;da FluentValidation ile Veri Do\u011frulama Sanat\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ASP.NET Core'da FluentValidation ile Veri Do\u011frulama Sanat\u0131","description":"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation'\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"ASP.NET Core'da FluentValidation ile Veri Do\u011frulama Sanat\u0131","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation'\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.","og_url":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-05T01:01:31+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"ASP.NET Core&#8217;da FluentValidation ile Veri Do\u011frulama Sanat\u0131","datePublished":"2025-10-05T01:01:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/"},"wordCount":4009,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":[".NET"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/","name":"ASP.NET Core'da FluentValidation ile Veri Do\u011frulama Sanat\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-05T01:01:31+00:00","description":"Modern web uygulamalar\u0131 geli\u015ftirirken, kullan\u0131c\u0131dan al\u0131nan verilerin g\u00fcvenilir ve tutarl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. ASP.NET Core projelerinde veri do\u011frulama s\u00fcre\u00e7lerini sadele\u015ftiren, esnek ve okunabilir hale getiren FluentValidation k\u00fct\u00fcphanesi, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Bu makale, FluentValidation'\u0131n temellerinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan mobil uyumlu do\u011frulama ipu\u00e7lar\u0131na kadar her \u015feyi kapsayan kapsaml\u0131 bir rehber niteli\u011findedir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-fluentvalidation-ile-veri-dogrulama-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ASP.NET Core&#8217;da FluentValidation ile Veri Do\u011frulama Sanat\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31049"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31049\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}