﻿
{"id":23364,"date":"2021-10-17T22:13:39","date_gmt":"2021-10-17T22:13:39","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23364"},"modified":"2021-10-17T22:13:39","modified_gmt":"2021-10-17T22:13:39","slug":"intercepting-filter-patternfiltreleme-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/intercepting-filter-patternfiltreleme-tasarim-deseni\/","title":{"rendered":"Intercepting Filter Pattern(Filtreleme Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, kullan\u0131c\u0131dan gelen iste\u011fi(request) i\u015fleme almadan \u00f6nce filtreleyip s\u00fczge\u00e7ten ge\u00e7irmemizi sa\u011flayan ya da istek neticesinde kullan\u0131c\u0131ya d\u00f6nd\u00fcr\u00fclecek cevab\u0131(response) modifiye ederek o \u015fekilde d\u00f6nd\u00fcrmemize imkan tan\u0131yacak olan <em>Intercepting Filter Pattern<\/em>&#8216;\u0131 inceliyor olaca\u011f\u0131z.<\/p>\n<p><strong>Intercepting Filter Pattern Nedir?<\/strong><br \/>\nBu pattern&#8217;\u0131 izah edebilmek i\u00e7in direkt olarak \u015f\u00f6yle bir \u00f6rnek \u00fczerinden misal verebiliriz; Bir uygulamada(web, masa\u00fcst\u00fc, console, mobile vs.) kullan\u0131c\u0131dan gelen istek \u00fczerine i\u015flem yapmadan \u00f6nce kullan\u0131c\u0131n\u0131n oturum a\u00e7\u0131p a\u00e7mad\u0131\u011f\u0131n\u0131 kontrol etmek ve session bilgileri bulunmad\u0131\u011f\u0131 taktirde kullan\u0131c\u0131ya iste\u011fin ba\u015far\u0131s\u0131z oldu\u011funu bildirip login sayfas\u0131na y\u00f6nlendirmek isteyebiliriz. Ayriyetten oturum a\u00e7m\u0131\u015fsa e\u011fer gerekli validation kurallar\u0131n\u0131 kontrol etmek ve iste\u011fi ancak bu \u015fekilde ba\u015far\u0131l\u0131 k\u0131lmak isteyebiliriz. Bunun yan\u0131nda kullan\u0131c\u0131ya bir cevap d\u00f6nerken bu cevap \u00fczerinde de farkl\u0131 modifikasyonlar ger\u00e7ekle\u015ftirip o \u015fekilde cevab\u0131 d\u00f6nmek isteyebiliriz. \u0130\u015fte bu ve bunun gibi istek s\u00fcre\u00e7lerinin basamakl\u0131 bir \u015fekilde b\u00f6l\u00fcmleme gereksinimi duyulan \u00e7al\u0131\u015fmalarda, tasar\u0131msal a\u00e7\u0131dan <em>Intercepting Filter Pattern<\/em>&#8216;\u0131 uygulayarak daha pratik ve stratejik \u00e7\u00f6z\u00fcmler getirebiliriz.<\/p>\n<p><strong>Intercepting Filter Pattern&#8217;\u0131n Mant\u0131\u011f\u0131 Nedir?<\/strong><br \/>\nIntercepting Filter Pattern&#8217;da merkezi olarak filtre g\u00f6revi g\u00f6ren s\u0131n\u0131flar bulunmaktad\u0131r. Bu s\u0131n\u0131flar s\u0131ral\u0131 bir \u015fekilde tetiklenerek i\u015flevsellik g\u00f6stermektedirler.<br \/>\n<div id=\"attachment_23373\" style=\"width: 869px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23373\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni.png\" alt=\"Intercepting Filter Pattern(Filtreleme Tasar\u0131m Deseni)\" width=\"859\" height=\"320\" class=\"size-full wp-image-23373\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni.png 859w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-300x112.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-768x286.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><\/a><p id=\"caption-attachment-23373\" class=\"wp-caption-text\">Bu mekanizmaya &#8216;Filter Chaining&#8217; denmektedir.<\/p><\/div>Yukar\u0131daki g\u00f6rsel \u015femay\u0131 incelersek e\u011fer her bir filtre kendi g\u00f6revini yerine getirdikten sonra kontrol\u00fc kendinden sonraki filtreye b\u0131rakmaktad\u0131r. Bu s\u00fcreci de yaz\u0131m\u0131z\u0131n devam\u0131nda ilgili pattern&#8217;\u0131 stratejik olarak incelerken g\u00f6rece\u011fimiz \u00fczere &#8216;<em>Filter Manager<\/em>&#8216; isimli s\u0131n\u0131f y\u00fcr\u00fctmektedir.<\/p>\n<p>Filtrelerin i\u015flevleri s\u0131ras\u0131nda herhangi bir filtrede hatal\u0131 bir durum meydana gelir yahut tespit edilirse kendinden sonraki gelen filtreler devreye girmeden i\u015flem durdurulur ve kullan\u0131c\u0131ya duruma dair gerekli bildiride bulunulur.<\/p>\n<blockquote><p><em style=\"color:purple;\">Intercepting Filter Pattern, istekleri kar\u015f\u0131layacak ve handle edecek olan temel kod \u00fczerinde, de\u011fi\u015fikliklere ve modifikasyonlara gerek kalmaks\u0131z\u0131n ortak hizmetleri standart bir \u015fekilde i\u015flemek amac\u0131yla tak\u0131labilir filtreler olu\u015fturmam\u0131z\u0131 sa\u011flayan bir modeldir. Bu filtreler mevcut kodu de\u011fi\u015ftirmeksizin uygulamaya eklenerek devreye sokulabilir yahut \u00e7\u0131kar\u0131larak nitelikleri pasifize edilebilir.<\/em><\/p><\/blockquote>\n<p><strong>Intercepting Filter Pattern&#8217;\u0131n Uygulanmas\u0131<\/strong><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni.gif\" alt=\"Intercepting Filter Pattern(Filtreleme Tasar\u0131m Deseni)\" width=\"401\" height=\"248\" class=\"alignleft size-full wp-image-23372\" \/><\/a>Intercepting Filter Pattern&#8217;\u0131n\u0131 uygulayabilmek i\u00e7in yandaki \u015femada oldu\u011fu gibi &#8216;Filter Manager&#8217;, &#8216;Filter Chain&#8217;, &#8216;Filters&#8217; ve &#8216;Target&#8217; akt\u00f6rlerinin kurguda yer almas\u0131 gerekmektedir.<\/p>\n<p>Bu akt\u00f6rlerin k\u0131saca ne oldu\u011funa de\u011finmemiz gerekirse e\u011fer;<br \/>\n<br \/>\n&nbsp;<\/p>\n<ul>\n<li><strong>Filter Manager<\/strong><br \/>\nFiltre i\u015flemeyi y\u00f6neten s\u0131n\u0131ft\u0131r. Do\u011fru s\u0131ralamada filtre zincirini(Filter Chain) olu\u015fturur ve i\u015flemeyi ba\u015flat\u0131r.\n<\/li>\n<li><strong>Filter Chain<\/strong><br \/>\nFiltreleri belirli bir target&#8217;a \u00f6zel s\u0131ral\u0131 bir \u015fekilde listeleyen(bir ba\u015fka deyi\u015fle tutan) ve tetikleyen s\u0131n\u0131ft\u0131r.\n<\/li>\n<li><strong>Filters<\/strong><br \/>\nBir i\u015fe odaklanm\u0131\u015f filtrelerdir. Bu filtrelerin s\u0131ral\u0131 bir \u015fekilde i\u015flenmesi filtre zinciri taraf\u0131ndan kontrol edilir.\n<\/li>\n<li><strong>Target<\/strong><br \/>\nClient taraf\u0131ndan talep edilen kaynakt\u0131r\/servistir\/i\u015flemdir.\n<\/li>\n<\/ul>\n<p><strong>Pratik \u00d6rnek<\/strong><br \/>\n\u015eimdi, Intercepting Filter Pattern stratejisini yukar\u0131daki ilk g\u00f6rselde verilen mant\u0131\u011fa uygun bir senaryo \u00fczerinden \u00f6rneklendirelim. Senaryomuz; client&#8217;tan personel(EmployeeService) ve m\u00fc\u015fteri(CustomerService) bilgileri i\u00e7in gelen istek s\u00fcre\u00e7lerinde, \u00f6ncelikle kullan\u0131c\u0131 kimlik do\u011frulama kontrol\u00fc(AuthenticationFilter) ve ard\u0131ndan validasyon kontrol\u00fc(ValidationFilter) yap\u0131larak her iki durumun do\u011frulanmas\u0131 neticesinde istekle ilgili sonucun \u00fcretilip d\u00f6nd\u00fcr\u00fclmesini, aksi taktirde herhangi bir filtrede olu\u015fan ayk\u0131r\u0131 duruma binaen kullan\u0131c\u0131y\u0131 uyararak iste\u011fin hedef servise eri\u015femeden iptal edilmesini ger\u00e7ekle\u015ftirelim.<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>Ad\u0131m 1 &#8211; <span style=\"color:green;font-size:13px;\">Target Interface<\/span><\/em><\/strong><br \/>\nHer\u015feyden \u00f6nce client&#8217;\u0131n eri\u015fmek istedi\u011fi hedef(target) servislerini in\u015fa ederek ba\u015flayaca\u011f\u0131z. Bunun i\u00e7in de \u00f6ncelik olarak <em>Target Interface<\/em>&#8216;i tasarlayarak ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Target Interface\r\n    public interface ITarget\r\n    {\r\n        void Handler();\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong><em>Ad\u0131m 2 &#8211; <span style=\"color:green;font-size:13px;\">Targets<\/span><\/em><\/strong><br \/>\n&#8216;EmployeeService&#8217; ve &#8216;CustomerService&#8217; s\u0131n\u0131flar\u0131n\u0131 olu\u015fturarak somut hedeflerimizi(concrete target) olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete Target\r\n    public class EmployeeService : ITarget\r\n    {\r\n        public void Handler()\r\n            =&gt; Console.WriteLine(&quot;Employee Service Ok&quot;);\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Concrete Target\r\n    public class CustomerService : ITarget\r\n    {\r\n        public void Handler()\r\n            =&gt; Console.WriteLine(&quot;Customer Service Ok&quot;);\r\n    }\r\n<\/pre>\n<p>Burada \u00f6rnek servis kodlar\u0131na dikkat ederseniz e\u011fer i\u00e7lerinde farazi olacak \u015fekilde ekrana belirli ifadeler bas\u0131lmaktad\u0131r. Tabi ki de ger\u00e7ek bir senaryoda ilgili servisler ihtiyaca istinaden geli\u015ftirilecek ve gerekli davran\u0131\u015flar\u0131 sergileyecektirler.\n<\/li>\n<li><strong><em>Ad\u0131m 3 &#8211; <span style=\"color:green;font-size:13px;\">Filter Interface<\/span><\/em><\/strong><br \/>\nArt\u0131k bu ad\u0131ma kadar client&#8217;\u0131n talep edece\u011fi hedef s\u0131n\u0131flar\u0131m\u0131z hali haz\u0131rda mevcuttur. Bundan sonra client&#8217;tan gelecek olan talebin ya\u015fam d\u00f6ng\u00fcs\u00fc s\u00fcrecinde devreye girecek olan filtreleri temsil edecek olan <em>Filter Interface<\/em> aray\u00fcz\u00fcn\u00fc tasarlayarak yola devam edebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Filter Interface\r\n    public interface IFilter\r\n    {\r\n        void Execute();\r\n    }\r\n<\/pre>\n<p>Sistemde kullan\u0131lacak t\u00fcm filtreler, olu\u015fturulan bu &#8216;IFilter&#8217; aray\u00fcz\u00fcn\u00fc implemente etmek mecburiyetindedirler.\n<\/li>\n<li><strong><em>Ad\u0131m 4 &#8211; <span style=\"color:green;font-size:13px;\">Filters<\/span><\/em><\/strong><br \/>\nSenaryo gere\u011fi kullan\u0131c\u0131 kimlik do\u011frulama kontrol\u00fcn\u00fc ger\u00e7ekle\u015ftirecek olan &#8216;Authentication Filter&#8217; ile birlikte validasyon kontrol\u00fcn\u00fc sa\u011flayacak olan &#8216;Validation Filter&#8217; s\u0131n\u0131flar\u0131n\u0131 tasarlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Filter\r\n    public class AuthenticationFilter : IFilter\r\n    {\r\n        public void Execute()\r\n        {\r\n            bool isAuthenticated = Configuration.IsAuthenticated;\r\n            if (isAuthenticated)\r\n                Console.WriteLine(&quot;User Authenticated&quot;);\r\n            else\r\n                throw new AuthenticationException();\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Filter\r\n    public class ValidationFilter : IFilter\r\n    {\r\n        public void Execute()\r\n        {\r\n            bool isValidated = Configuration.IsValidated;\r\n            if (isValidated)\r\n                Console.WriteLine(&quot;Validated&quot;);\r\n            else\r\n                throw new ValidationException();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki filtre s\u0131n\u0131flar\u0131n\u0131 incelerseniz e\u011fer sorumluluklar\u0131na uygun gerekli kontrolleri yapt\u0131ktan sonra ya iste\u011fin ak\u0131\u015f\u0131na izin vermektedirler ya da aksi bir durum s\u00f6z konusuysa hata f\u0131rlatarak s\u00fcreci sonland\u0131rmaktad\u0131rlar. Burada birazdan ger\u00e7ekle\u015ftirece\u011fimiz test s\u00fcrecinde filtreleri daha rahat deneyebilmek i\u00e7in a\u015fa\u011f\u0131daki &#8216;Configuration&#8217; static s\u0131n\u0131f\u0131 \u00fczerinden de\u011ferler kontroll\u00fc bir \u015fekilde verilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Configuration\r\n    {\r\n        static public bool IsAuthenticated { get; set; }\r\n        static public bool IsValidated { get; set; }\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong><em>Ad\u0131m 5 &#8211; <span style=\"color:green;font-size:13px;\">Filter Chain<\/span><\/em><\/strong><br \/>\nOlu\u015fturulan bu filtreleri belirli bir <u>hedef\/target&#8217;a \u00f6zel<\/u> s\u0131ral\u0131 bir \u015fekilde tutacak ve zincirleme tetikleyecek olan <em>Filter Chain<\/em> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Filter Chain\r\n    public class FilterChain\r\n    {\r\n        readonly List&lt;IFilter&gt; _filters = new();\r\n        ITarget _target;\r\n\r\n        public void AddFilter(IFilter filter)\r\n            =&gt; _filters.Add(filter);\r\n\r\n        public void RemoveFilter(IFilter filter)\r\n            =&gt; _filters.Remove(filter);\r\n\r\n        public void ExecuteFilters()\r\n        {\r\n            _filters.ForEach(filter =&gt; filter.Execute());\r\n            _target.Handler();\r\n        }\r\n\r\n        public ITarget Target { set =&gt; _target = value; }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer, belirli bir hedefe \u00f6zel(_target) filtreleri &#8216;IFilter&#8217; t\u00fcr\u00fcnden olan koleksiyon(_filters) i\u00e7erisinde tutmakta ve ilgili filtrelerin eklenmesi, \u00e7\u0131kar\u0131lmas\u0131 ve \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 i\u00e7in gerekli fonksiyonlar\u0131 bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<p>\u00d6zellikle &#8216;ExecuteFilters&#8217; metodunun i\u00e7eri\u011fine nazar eylerseniz e\u011fer \u00f6nce &#8216;_filters&#8217; koleksiyonundaki filtreler execute edilmekte ard\u0131ndan &#8216;_target&#8217; referans\u0131ndaki hedef servis handle edilerek tetiklenmektedir. Esas\u0131nda burada filtre i\u015flev \u00f6nceli\u011fi taraf\u0131m\u0131zca belirlenerek target&#8217;tan \u00f6nce ya da sonra olacak \u015fekilde \u00e7al\u0131\u015fmalar ger\u00e7ekle\u015ftirebiliriz. Haliyle bu metot, client&#8217;\u0131n yapaca\u011f\u0131 iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn i\u015flevsel kriti\u011fini bar\u0131nd\u0131ran noktad\u0131r diyebiliriz.\n<\/li>\n<li><strong><em>Ad\u0131m 6 &#8211; <span style=\"color:green;font-size:13px;\">Filter Manager<\/span><\/em><\/strong><br \/>\nVe son olarak client&#8217;\u0131n hedefledi\u011fi(target) servis i\u00e7in yap\u0131lan iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fcnde, filtre zincirini bar\u0131nd\u0131ran <em>Filter Chain<\/em> s\u0131n\u0131f\u0131n\u0131 y\u00f6netebilmek i\u00e7in Intercepting Filter Pattern&#8217;\u0131n kalbi olan <em>Filter Manager<\/em> s\u0131n\u0131f\u0131n\u0131 tasarlayarak, olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Filter Manager\r\n    public class FilterManager\r\n    {\r\n        FilterChain _filterChain;\r\n\r\n        public FilterManager(ITarget target)\r\n        {\r\n            _filterChain = new();\r\n            _filterChain.Target = target;\r\n        }\r\n\r\n        public void AddFilter(IFilter filter)\r\n            =&gt; _filterChain.AddFilter(filter);\r\n\r\n        public void RemoveFilter(IFilter filter)\r\n            =&gt; _filterChain.RemoveFilter(filter);\r\n\r\n        public void ExecuteFilters()\r\n            =&gt; _filterChain.ExecuteFilters();\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <em>Filter Manager<\/em> s\u0131n\u0131f\u0131 i\u00e7erisinde bar\u0131nd\u0131rd\u0131\u011f\u0131 <em>Filter Chain<\/em> referans\u0131 sayesinde constructor&#8217;da ald\u0131\u011f\u0131 target&#8217;a \u00f6zel uygulanacak filtreleri y\u00f6netmekte ve execute etmektedir.\n<\/li>\n<li><strong><em>Ad\u0131m 7 &#8211; <span style=\"color:green;font-size:13px;\">Test<\/span><\/em><\/strong><br \/>\nGeli\u015ftirdi\u011fimiz bu yap\u0131lanmay\u0131 a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fmayla teste tabi tutarsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Configuration.IsAuthenticated = true;\r\n            Configuration.IsValidated = true;\r\n\r\n            try\r\n            {\r\n                FilterManager filterManager = new(new EmployeeService());\r\n\r\n                filterManager.AddFilter(new AuthenticationFilter());\r\n                filterManager.AddFilter(new ValidationFilter());\r\n\r\n                filterManager.ExecuteFilters();\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                Console.WriteLine(ex.Message);\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-1.png\" alt=\"Intercepting Filter Pattern(Filtreleme Tasar\u0131m Deseni)\" width=\"164\" height=\"54\" class=\"alignright size-full wp-image-23410\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-1.png 164w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-1-160x54.png 160w\" sizes=\"auto, (max-width: 164px) 100vw, 164px\" \/><\/a>yandaki gibi bir ekran \u00e7\u0131kt\u0131s\u0131yla kar\u015f\u0131la\u015faca\u011f\u0131z. Nihayetinde kimlik do\u011frulama(IsAuthenticated) ve validasyon(IsValidated) kontrolleri i\u00e7in gerekli property&#8217;lere <code>true<\/code> de\u011ferini verdikten sonra(yani k\u0131smi olarak kimli\u011fin do\u011fruland\u0131\u011f\u0131 ve validasyonlar\u0131n ge\u00e7erli oldu\u011funu d\u00fc\u015f\u00fcn\u00fcrsek), &#8216;FilterManager&#8217; s\u0131n\u0131f\u0131 \u00fczerinden &#8216;EmployeeService&#8217; isimli servise yap\u0131lan talep s\u00fcrecinde eklenmi\u015f olan &#8216;AuthenticationFilter&#8217; ve &#8216;ValidationFilter&#8217; filtreleri s\u0131ras\u0131yla tetiklenmekte ve herhangi bir aksakl\u0131k olmad\u0131\u011f\u0131ndan dolay\u0131 servis execute edilmektedir.<\/p>\n<p>Misal, validasyonlar\u0131n(IsValidated) do\u011frulanmad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcrsek &#8216;ValidationFilter&#8217;da hata f\u0131rlat\u0131laca\u011f\u0131ndan dolay\u0131 a\u015fa\u011f\u0131daki gibi bir \u00e7\u0131kt\u0131 verilecektir;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-2.png\" alt=\"Intercepting Filter Pattern(Filtreleme Tasar\u0131m Deseni)\" width=\"714\" height=\"38\" class=\"aligncenter size-full wp-image-23414\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-2.png 714w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/Intercepting-Filter-PatternFiltreleme-Tasarim-Deseni-2-300x16.png 300w\" sizes=\"auto, (max-width: 714px) 100vw, 714px\" \/><\/a>\n<\/li>\n<\/ul>\n<p><strong>Intercepting Filter Pattern&#8217;in Faydalar\u0131 Nelerdir?<\/strong><\/p>\n<ul>\n<li>Intercepting Filter Pattern, iyile\u015ftirilmi\u015f yeniden kullan\u0131labilirlik sa\u011flar. Nihayetinde herhangi bir target&#8217;a yap\u0131lacak istek s\u00fcrecinde, \u00f6nceden geli\u015ftirilmi\u015f bir filtre ihtiyaca binaen tekrar rahatl\u0131kla kullan\u0131labilir. Nihayetinde bir filtrenin kullan\u0131labilirli\u011fi &#8216;IFilter&#8217; aray\u00fcz\u00fc sayesinde uygulamadaki t\u00fcm target&#8217;lara genellenebilece\u011finden dolay\u0131 yeniden kullan\u0131labilirlik hat safhaya \u00e7\u0131kacakt\u0131r.<\/li>\n<li>Intercepting Filter Pattern, filtrelerin istek s\u00fcre\u00e7lerinde opsiyonel olarak eklenilip \u00e7\u0131kar\u0131labilmesine imkan tan\u0131d\u0131\u011f\u0131 i\u00e7in esneklik sa\u011flamaktad\u0131r.<\/li>\n<\/ul>\n<p>Ayr\u0131ca unutulmamal\u0131d\u0131r ki, gereksiz yere uzun i\u015flev yapan filtreler client&#8217;tan gelen iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn s\u00fcresini uzataca\u011f\u0131ndan dolay\u0131 performans a\u00e7\u0131s\u0131ndan zarara u\u011fratabilir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, kullan\u0131c\u0131dan gelen iste\u011fi(request) i\u015fleme almadan \u00f6nce filtreleyip s\u00fczge\u00e7ten ge\u00e7irmemizi sa\u011flayan ya da istek neticesinde kullan\u0131c\u0131ya d\u00f6nd\u00fcr\u00fclecek cevab\u0131(response) modifiye ederek o \u015fekilde d\u00f6nd\u00fcrmemize imkan tan\u0131yacak olan Intercepting Filter Pattern&#8216;\u0131 inceliyor olaca\u011f\u0131z. Intercepting&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":23373,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[4424,4423,4425,4422,4421,4420],"class_list":["post-23364","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-filter-chain","tag-filter-chaining","tag-filter-manager","tag-filter-pattern","tag-filtreleme-tasarim-deseni","tag-intercepting-filter-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=23364"}],"version-history":[{"count":53,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23364\/revisions"}],"predecessor-version":[{"id":23421,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23364\/revisions\/23421"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23373"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}