﻿
{"id":4105,"date":"2016-04-22T16:28:54","date_gmt":"2016-04-22T16:28:54","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4105"},"modified":"2016-04-22T16:28:55","modified_gmt":"2016-04-22T16:28:55","slug":"dependency-injectiondi-ninject","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/dependency-injectiondi-ninject\/","title":{"rendered":"Dependency Injection(DI) &#8211; Ninject"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00d6nceki yaz\u0131lar\u0131mdan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injection-nedir-nasil-uygulanir\/\" target=\"_blank\">Dependency Injection(DI) Nedir? Nas\u0131l Uygulan\u0131r?<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131mda Dependency Injection desenine detayl\u0131ca de\u011finmi\u015ftik. Bu yaz\u0131m\u0131zda ise bu desene uygun tasarlanm\u0131\u015f Inversion of Control(IoC) Framework&#8217;\u00fc olan Ninject \u00fczerine konu\u015faca\u011f\u0131z.<\/p>\n<p>Biliyoruz ki, uygulama i\u00e7erisinde nesne yaratma s\u00fcrecinin sizden al\u0131n\u0131p, bunun bir \u00e7at\u0131ya yani Framework&#8217;e devredilmesi i\u015flemine Inversion of Control denmektedir. Dependency Injection deseninin ise i\u015flevsel olarak, nesneler aras\u0131nda ba\u011f\u0131ml\u0131l\u0131klar\u0131 soyutlama g\u00f6revini y\u00fcr\u00fctt\u00fc\u011f\u00fcn\u00fc biliyoruz. \u0130\u015fte Ninject &#8211; IoC Library&#8217;si, DI desenini basit\u00e7e uygulayabilmemizi ve kullanmam\u0131z\u0131 sa\u011flayan haz\u0131r bir Container(kapsay\u0131c\u0131) olarak in\u015fa edilmi\u015ftir.<\/p>\n<p>Asl\u0131nda bu i\u015flem i\u00e7in geli\u015ftirilmi\u015f pek \u00e7ok Container mevcuttur. Ninject d\u0131\u015f\u0131nda; Castle Windsor, Spring.NET ve Unity k\u00fct\u00fcphanelerinede g\u00f6z atabilirsiniz.(<em>Bu i\u00e7eri\u011fi olu\u015fturdu\u011fum tarihlerde benimde bu k\u00fct\u00fcphaneler hakk\u0131nda bir bilgim yoktur. \u00c7al\u0131\u015fma f\u0131rsat\u0131 yakalay\u0131p s\u0131rra vak\u0131f olmu\u015fsam e\u011fer yaz\u0131ya d\u00f6km\u00fc\u015f olurum in\u015fallah.<\/em>)<\/p>\n<p>\u015eimdi Ninject librarysine gelmeden \u00f6nce bu yap\u0131y\u0131 kullanaca\u011f\u0131m\u0131z DI senaryosunu <a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injection-nedir-nasil-uygulanir\/\" target=\"_blank\">\u00f6nceki yaz\u0131m\u0131zdan<\/a> a\u015fa\u011f\u0131ya ta\u015f\u0131yal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Vasita\r\n    {\r\n        ITasit _tasit;\r\n        public Vasita(ITasit tasit)\r\n        {\r\n            _tasit = tasit;\r\n        }\r\n\r\n        public void Kullan()\r\n        {\r\n            _tasit.GazVer();\r\n            _tasit.SagaSinyal();\r\n            _tasit.FrenYap();\r\n            _tasit.SolaSinyal();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00d6nceki yaz\u0131y\u0131 incelerseniz e\u011fer olu\u015fturdu\u011fumuz DI tasar\u0131m\u0131nda yukar\u0131daki yap\u0131y\u0131 elde etmi\u015ftik. Tabi siz DI tasar\u0131m desenine hakimseniz yukar\u0131daki yap\u0131 sizin i\u00e7in senaryodan ba\u011f\u0131ms\u0131z bir anlam ifade edece\u011finden \u00f6nceki yaz\u0131y\u0131 okuman\u0131za hi\u00e7 gerek yoktur.<\/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            Vasita vasita1 = new Vasita(new Otobus());\r\n            vasita1.Kullan();\r\n\r\n            Vasita vasita2 = new Vasita(new Araba());\r\n            vasita2.Kullan();\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yap\u0131lan tasar\u0131 bu \u015fekilde kullan\u0131labilmektedir.<\/p>\n<p>\u015eimdi bu DI tasar\u0131m\u0131nda daha h\u0131zl\u0131 ve aktif bir i\u015flev sergileyecek olan Ninject k\u00fct\u00fcphanesini kullanal\u0131m.<\/p>\n<p>Bu i\u015flem i\u00e7in \u00f6ncelikle Ninject k\u00fct\u00fcphanesini projeye entegre etmeliyiz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injectiondi-ninject\/dependency-injectiondi-ninject\/\" rel=\"attachment wp-att-4112\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4112\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject.png\" alt=\"Dependency Injection(DI) - Ninject\" width=\"703\" height=\"216\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject.png 703w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-300x92.png 300w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/a><\/p>\n<p>&#8220;Tools&#8221; -&gt; &#8220;NuGet Package Manager&#8221; -&gt; &#8220;Manage NuGet Packages for Solution&#8221;&#8230; kombinasyonlar\u0131n\u0131 takip ederek NuGet pencersini a\u00e7\u0131n\u0131z.(bilmeyenler i\u00e7in)<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injectiondi-ninject\/dependency-injectiondi-ninject-2\/\" rel=\"attachment wp-att-4113\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4113\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-1.png\" alt=\"Dependency Injection(DI) - Ninject\" width=\"1089\" height=\"305\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-1.png 1089w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-1-300x84.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-1-768x215.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-1-1024x287.png 1024w\" sizes=\"auto, (max-width: 1089px) 100vw, 1089px\" \/><\/a><\/p>\n<p>Ekranda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Ninject k\u00fct\u00fcphanesini Install ediniz.<\/p>\n<p>Bu i\u015flemler neticesinde Ninject k\u00fct\u00fcphanesini projenize ba\u015far\u0131yla entegre etmi\u015f oluyorsunuz.<\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/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            #region Ninject \u0130le Dependency Injection Kullan\u0131m\u0131\r\n\r\n            \/\/Ninject \u00e7ekirde\u011fi olu\u015fturuyoruz.\r\n            IKernel kernel = new StandardKernel();\r\n\r\n            kernel.Bind&lt;ITasit&gt;().To&lt;Otobus&gt;();\r\n\r\n            var Vasita = kernel.Get&lt;Vasita&gt;();\r\n\r\n            Vasita.Kullan();\r\n            #endregion\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu izah etmemiz gerekirse e\u011fer;<\/p>\n<ul style=\"list-style-type: circle;\">\n<li>10. sat\u0131rda, Ninject \u00e7ekirde\u011fi ITasit aray\u00fcz\u00fc g\u00f6rd\u00fc\u011f\u00fcnde Otobus s\u0131n\u0131f\u0131ndan bir nesne ba\u011flamaktad\u0131r.<\/li>\n<li>12. sat\u0131rda, Ninject \u00e7ekirde\u011finden bir Vasita nesnesi talep edilmektedir.<\/li>\n<li>14. sat\u0131rda, Ninject \u00e7ekirde\u011finden talep edilen Vasita nesnesinin Kullan metodu sorunsuz \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r.<\/li>\n<\/ul>\n<p><em><strong>\u0130yi g\u00fczel&#8230; Peki arka planda nas\u0131l bir mant\u0131k s\u00f6z konusu?<\/strong><\/em><br \/>\nNinject \u00e7ekirde\u011fi, kendisine verilen aray\u00fcz ve s\u0131n\u0131f aras\u0131nda bir ba\u011flant\u0131 kurmakta ve ayn\u0131 \u00e7ekirdekten talep edilen nesne \u00fczerinde bu yap\u0131lar mevcutsa otomatik bu ba\u011flant\u0131y\u0131 sa\u011flamaktad\u0131r. Yapt\u0131\u011f\u0131m\u0131z i\u015flemlere bakarsak e\u011fer Ninject \u00e7ekirde\u011fine, Vasita s\u0131n\u0131f\u0131na \u00f6zel bir tan\u0131mlama yapmad\u0131\u011f\u0131m\u0131z halde kodumuz sorunsuz \u00e7al\u0131\u015fmaktad\u0131r. Ninject \u00e7ekirde\u011fi, tan\u0131mlamas\u0131 yap\u0131lmam\u0131\u015f t\u00fcrler i\u00e7in ak\u0131ll\u0131 bir strateji takip etmektedir. Get metodu ile talep edilen s\u0131n\u0131f\u0131n tan\u0131mlamas\u0131 bulunmuyorsa varsay\u0131lan tan\u0131m \u00fczerinden i\u015flemleri sorunsuz halledecektir. Vasita s\u0131n\u0131f\u0131nda da haliyle ITasit tipinde bulunan referansa, otomatik olarak Otobus nesnesini ba\u011flamakta, haliyle talep edilen Vasita s\u0131n\u0131f\u0131da bu donan\u0131mda yarat\u0131lmaktad\u0131r.<\/p>\n<p>Ayriyetten \u00f6rnekte kulland\u0131\u011f\u0131m\u0131z Vasita s\u0131n\u0131f\u0131 parametreli constructer&#8217;a sahiptir. Lakin biz Get metodu ile Vasita s\u0131n\u0131f\u0131ndan sorunsuz nesne talep edebildik. \u0130\u015fte bunu ba\u015faran mekanizma \u015fu \u015fekilde \u00e7al\u0131\u015fmaktad\u0131r. Get metodu ile talep edilen s\u0131n\u0131ftan nesne olu\u015fturmadan \u00f6nce ilgili s\u0131n\u0131f\u0131n constructer&#8217;\u0131 kontrol edilmektedir. E\u011fer varsay\u0131lan constructer mevcutsa direkt ilgili nesneyi yaratacakt\u0131r. Yok e\u011fer varsay\u0131lan constructer ezilmi\u015fse ve parametre al\u0131yorsa en fazla t\u00fcr bilgisi e\u015fle\u015ftirmesine sahip olan constructer&#8217;\u0131 kullanacakt\u0131r. Yani anlayaca\u011f\u0131n\u0131z, Ninject Vasita s\u0131n\u0131f\u0131n\u0131n constructer&#8217;\u0131na bak\u0131yor, ne al\u0131nm\u0131\u015f ITasit tipinde bir parametre. Ninject \u00e7ekirde\u011finde tan\u0131mlamas\u0131 yap\u0131lan aray\u00fcz tipide ITasit oldu\u011fu i\u00e7in bu e\u015fle\u015fme neticesinde bu constructer&#8217;\u0131 otomatik olarak kullan\u0131yor. <\/p>\n<p>\u015eimdi, ITasit interface&#8217;i ile ba\u011flant\u0131 kurdu\u011fumuz Otobus s\u0131n\u0131f\u0131n\u0131n constructer&#8217;\u0131na a\u015fa\u011f\u0131daki gibi yeni bir aray\u00fcz tan\u0131mlamas\u0131 yapal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    interface IDurak\r\n    {\r\n        int Durak();\r\n    }\r\n    class ADurak : IDurak\r\n    {\r\n        public ADurak()\r\n        {\r\n            Durak();\r\n        }\r\n        public int Durak()\r\n        {\r\n            Console.WriteLine(&quot;A duraktay\u0131z.&quot;);\r\n            return 10;\r\n        }\r\n    }\r\n    class BDurak : IDurak\r\n    {\r\n        public BDurak()\r\n        {\r\n            Durak();\r\n        }\r\n        public int Durak()\r\n        {\r\n            Console.WriteLine(&quot;B duraktay\u0131z.&quot;);\r\n            return 15;\r\n        }\r\n    }\r\n    class CDurak : IDurak\r\n    {\r\n        public CDurak()\r\n        {\r\n            Durak();\r\n        }\r\n        public int Durak()\r\n        {\r\n            Console.WriteLine(&quot;C duraktay\u0131z.&quot;);\r\n            return 20;\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Otobus : ITasit\r\n    {\r\n        IDurak durak;\r\n        public Otobus(IDurak durak)\r\n        {\r\n            this.durak = durak;\r\n        }\r\n\r\n        .\r\n        . \/\/ ITasit'\u0131n uygulatt\u0131\u011f\u0131 elemanlar\r\n        .\r\n    }\r\n<\/pre>\n<p>Yapt\u0131\u011f\u0131m\u0131z bu i\u015flem neticesinde projemizi derleyip \u00e7al\u0131\u015ft\u0131r\u0131rsak e\u011fer a\u015fa\u011f\u0131daki hatay\u0131 alaca\u011f\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injectiondi-ninject\/dependency-injectiondi-ninject-3\/\" rel=\"attachment wp-att-4123\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-2.png\" alt=\"Dependency Injection(DI) - Ninject\" width=\"949\" height=\"470\" class=\"aligncenter size-full wp-image-4123\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-2.png 949w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-2-300x149.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Dependency-InjectionDI-Ninject-2-768x380.png 768w\" sizes=\"auto, (max-width: 949px) 100vw, 949px\" \/><\/a><\/p>\n<p>\u015eimdi bu hatay\u0131 anlatmadan \u00f6nce Ninject&#8217;den nesne talep s\u00fcrecinde i\u00e7 i\u00e7e ba\u011f olu\u015fturma yetene\u011fine de\u011finmem gerekecek. Ninject \u00e7ekirde\u011fine tan\u0131mlanan tipler i\u00e7erisinde herhangi biri constructer&#8217;dan yine tan\u0131mlanm\u0131\u015f bir tipi parametre olarak al\u0131yorsa Ninject yap\u0131sal olarak ilgili tipte e\u015fle\u015fmeye en uygun constructer&#8217;\u0131 tetikleyecektir. Yukar\u0131daki Ninject&#8217;in bu \u00f6zelli\u011fini kullanamam\u0131z\u0131n sebebi IDurak interface&#8217;ini belli bir tipe ba\u011flamam\u0131zdan kaynaklanmaktad\u0131r.<\/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            #region Ninject \u0130le Dependency Injection Kullan\u0131m\u0131\r\n            \/\/Ninject \u00e7ekirde\u011fi olu\u015fturuyoruz.\r\n            IKernel kernel = new StandardKernel();\r\n\r\n            kernel.Bind&lt;ITasit&gt;().To&lt;Otobus&gt;();\r\n            kernel.Bind&lt;IDurak&gt;().To&lt;ADurak&gt;();\r\n\r\n            var Vasita = kernel.Get&lt;Vasita&gt;();\r\n\r\n            Vasita.Kullan();\r\n            #endregion\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Ninject \u00e7ekirde\u011fine IDurak interface&#8217;i ile ADurak s\u0131n\u0131f\u0131 aras\u0131nda yeni bir ba\u011flant\u0131 ekledim. Art\u0131k bu i\u015flemden sonra projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda sorunsuz i\u015fledi\u011fini g\u00f6receksiniz.<\/p>\n<h2>Enjeksiyon Desenleri<\/h2>\n<p>\u015euana kadar Constructer Injection y\u00f6ntemiyle Ninject&#8217;i sizlere anlatt\u0131m. Bunlar\u0131n d\u0131\u015f\u0131nda Property Setter Injection ve Setter Method Injection y\u00f6ntemlerini de Ninject desteklemektedir.<\/p>\n<h3>Property Setter Injection<\/h3>\n<p>Ninject&#8217;in ba\u011f\u0131ml\u0131l\u0131klar\u0131 enjekte etmek istedi\u011fimiz propertyleri Inject attribute&#8217;u ile i\u015faretlememiz yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Vasita\r\n    {\r\n        &#x5B;Inject]\r\n        public ITasit _tasit { get; set; }\r\n\r\n        public void Kullan()\r\n        {\r\n            _tasit.GazVer();\r\n            _tasit.SagaSinyal();\r\n            _tasit.FrenYap();\r\n            _tasit.SolaSinyal();\r\n        }\r\n    }\r\n<\/pre>\n<h3>Setter Method Injection<\/h3>\n<p>Property Setter Injection&#8217;a benzer \u015fekilde gene Inject attribute&#8217;unu kullanmam\u0131z yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Vasita\r\n    {\r\n        ITasit _tasit;\r\n        &#x5B;Inject]\r\n        public void VasitaAl(ITasit tasit) {\r\n            this._tasit = tasit;\r\n        }\r\n\r\n        public void Kullan()\r\n        {\r\n            _tasit.GazVer();\r\n            _tasit.SagaSinyal();\r\n            _tasit.FrenYap();\r\n            _tasit.SolaSinyal();\r\n        }\r\n    }\r\n<\/pre>\n<p>Uygulamada kullan\u0131lan s\u0131n\u0131flar aras\u0131nda ba\u011f\u0131ml\u0131l\u0131k artt\u0131k\u00e7a Ninject k\u00fct\u00fcphanesinin de\u011feri ve k\u0131ymeti daha \u00e7ok anla\u015f\u0131lmaktad\u0131r.<\/p>\n<p>Velhas\u0131l, okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\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, \u00d6nceki yaz\u0131lar\u0131mdan Dependency Injection(DI) Nedir? Nas\u0131l Uygulan\u0131r? ba\u015fl\u0131kl\u0131 yaz\u0131mda Dependency Injection desenine detayl\u0131ca de\u011finmi\u015ftik. Bu yaz\u0131m\u0131zda ise bu desene uygun tasarlanm\u0131\u015f Inversion of Control(IoC) Framework&#8217;\u00fc olan Ninject \u00fczerine konu\u015faca\u011f\u0131z. Biliyoruz ki, uygulama i\u00e7erisinde&#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":4129,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,153],"tags":[1120,1124,1123,1116,1117,1118,1119,1125,1126,1121,1122],"class_list":["post-4105","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-design-pattern","tag-castle-windsor","tag-constructer-injection","tag-enjeksiyon-desenleri","tag-inversion-of-control","tag-ioc","tag-ioc-library","tag-ninject","tag-property-setter-injection","tag-setter-method-injection","tag-spring-net","tag-unity"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4105","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=4105"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4105\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/4129"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}