﻿
{"id":24561,"date":"2022-03-06T21:01:11","date_gmt":"2022-03-06T21:01:11","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24561"},"modified":"2022-03-06T21:01:11","modified_gmt":"2022-03-06T21:01:11","slug":"asp-net-core-constructor-injection-hell-durumuna-karsilik-alternatif-cozumler","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-constructor-injection-hell-durumuna-karsilik-alternatif-cozumler\/","title":{"rendered":"Asp.NET Core &#8211; Constructor Injection Hell Durumuna Kar\u015f\u0131l\u0131k Alternatif \u00c7\u00f6z\u00fcmler"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Asp.NET Core uygulamalar\u0131nda, s\u0131n\u0131flar\u0131n instance&#8217;lar\u0131n\u0131 <em>Inversion of Control<\/em> prensibi gere\u011fi y\u00f6netebilmek i\u00e7in <em>IoC Container<\/em> kullan\u0131lmaktad\u0131r. Bu container sayesinde s\u0131n\u0131f nesnelerinin olu\u015fturulmas\u0131, silinmesi ve kullan\u0131m \u00f6mr\u00fc gibi yap\u0131land\u0131rmalar sa\u011flanarak bu s\u0131n\u0131flara olan ba\u011f\u0131ml\u0131l\u0131k b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131lmakta, yeniden kullan\u0131m ve test edilebilirlik basitle\u015ftirilmektedir. IoC container&#8217;\u0131n bizlere sa\u011flad\u0131\u011f\u0131 bu avantajlar\u0131n yan\u0131nda, kimi controller&#8217;lar da <em>Constructor Injection Hell<\/em> ad\u0131 verilen haddinden fazla instance talepleri s\u00f6z konusu olabilmektedir. Bu i\u00e7eri\u011fimizde, bu durumlara istanaden nas\u0131l bir yakla\u015f\u0131m sergilenmesi gerekti\u011fini, biryandan durumlar\u0131 sim\u00fcle ederek farkl\u0131 k\u00fct\u00fcphaneler e\u015fli\u011finde izah etmeye \u00e7al\u0131\u015f\u0131yor olaca\u011f\u0131z. Buyrun ba\u015flayal\u0131m.<\/p>\n<h4>Constructor Injection Hell Nedir?<\/h4>\n<p>Klasik Asp.NET Core uygulamalar\u0131nda IoC Container&#8217;dan bir nesneyi talep edebilmek i\u00e7in Constructor Injection dedi\u011fimiz a\u015fa\u011f\u0131daki davran\u0131\u015f\u0131 sergilemekteyiz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    public class FooController : ControllerBase\r\n    {\r\n        private readonly ILogger&lt;FooController&gt; _logger;\r\n        private readonly IOrderRepository _orderRepository;\r\n        private readonly IProductRepository _productRepository;\r\n        private readonly IRoleManager _roleManager;\r\n        private readonly IUserManager _userManager;\r\n        private readonly IUserRepository _userRepository;\r\n        .\r\n        .\r\n        .\r\n        .\r\n\r\n        public FooController(\r\n            ILogger&lt;FooController&gt; logger,\r\n            IOrderRepository orderRepository,\r\n            IProductRepository productRepository,\r\n            IRoleManager roleManager,\r\n            IUserManager userManager,\r\n            IUserRepository userRepository,\r\n            .\r\n            .\r\n            .\r\n            .)\r\n        {\r\n            _logger = logger;\r\n            _orderRepository = orderRepository;\r\n            _productRepository = productRepository;\r\n            _roleManager = roleManager;\r\n            _userManager = userManager;\r\n            _userRepository = userRepository;\r\n            .\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Normal \u015fartlarda 3 &#8211; 5 kadar adil say\u0131daki servisin constructor injection ile talep edilmesi gayet normal ve kabul edilebilir bir yakla\u015f\u0131md\u0131r. Lakin ilgili yaz\u0131l\u0131m\u0131n geli\u015ftirme s\u00fcreci uzad\u0131k\u00e7a ve kapsam\u0131 geni\u015fledik\u00e7e inject edilen bu servisler yukar\u0131daki sat\u0131rlarda da bahsedildi\u011fi gibi haddinden fazla say\u0131da olabilirler. Hal b\u00f6yle olunca bir controller&#8217;\u0131n bu derece injecte bo\u011fulmas\u0131 <em>Constructor Injection Hell<\/em> yani <em>Constructor Injection Cehennemi<\/em> olarak nitelendirilmektedir. Bir controller, i\u00e7erisindeki action&#8217;lara odakl\u0131 bir \u015fekilde geli\u015ftirilmekten ziyade hacminin b\u00fcy\u00fck k\u0131sm\u0131n\u0131 inject operasyonlar\u0131na ay\u0131r\u0131yorsa bu durum geli\u015ftirme s\u00fcrecini olabildi\u011fince olumsuz etkileyebilmektedir. Misal olarak, onlarca inject aras\u0131ndan arad\u0131\u011f\u0131n\u0131z servisin olup olmad\u0131\u011f\u0131n\u0131 g\u00f6rebilmek yahut var olan\u0131 kald\u0131rabilmek i\u00e7in g\u00f6z\u00fcn\u00fczle ciddi bir efor sarfetmeniz gerekebilmektedir.<\/p>\n<p>Ayr\u0131ca constructor injection hell; yaz\u0131lan kodun, k\u00f6t\u00fc kodlara(bad code) kar\u015f\u0131l\u0131k temiz tutulmas\u0131 i\u00e7in uyulmas\u0131 gereken 10\/100 kural\u0131na ayk\u0131r\u0131 bir durum ortaya \u00e7\u0131karmaktad\u0131r. <strong><em>Neydi bu 10\/100 kural\u0131?<\/em><\/strong> diye sorarsan\u0131z e\u011fer;<\/p>\n<ul>\n<li>1- Bir metot 10 sat\u0131ra ula\u015f\u0131rsa e\u011fer durman\u0131z ve metodu tekrar de\u011ferlendirip refactoring yapman\u0131z gerekir.<\/li>\n<li>2- Bir s\u0131n\u0131f 100 sat\u0131ra ula\u015f\u0131rsa(yorumlar ve parantezler dahil) e\u011fer durman\u0131z ve s\u0131n\u0131f\u0131 tekrar de\u011ferlendirip refactoring yapman\u0131z gerekir.<\/li>\n<\/ul>\n<p>Haliyle constructor injection hell durumunda her ne kadar \u00f6zelde olsa \u00f6z\u00fcnde yine bir metot olan constructor 10\/100 kural\u0131n\u0131 refactoring yap\u0131lamayacak \u015fekilde \u00e7i\u011fnemektedir.<\/p>\n<p>Hele hele bu tarz constructor&#8217;\u0131 \u015fi\u015firilmi\u015f yap\u0131lanmalarla test s\u00fcre\u00e7lerine girdi\u011finizi d\u00fc\u015f\u00fcrseniz her bir parametreye kar\u015f\u0131l\u0131k verece\u011finiz de\u011ferleri y\u00f6netebilmenin ayr\u0131 bir zahmet olaca\u011f\u0131 a\u015fikar olsa gerek. <\/p>\n<h4>\u00c7\u00f6z\u00fcm Olarak \u00d6nerilen Nedir?<\/h4>\n<p>Constructor Injection Hell&#8217;e kar\u015f\u0131 \u00e7\u00f6z\u00fcm olarak en etkili y\u00f6ntem instance y\u00f6netiminin bir servis taraf\u0131ndan sa\u011flanmas\u0131d\u0131r. Bunu sa\u011flayan servisin yapt\u0131\u011f\u0131 i\u015fleme bizler <em><strong>Automatic Factory<\/strong><\/em> diyece\u011fiz. Bunun i\u00e7in olgun bir IoC Container olan <em><a href=\"https:\/\/github.com\/castleproject\/Windsor\" rel=\"noopener\" target=\"_blank\">Castle Windsor<\/a><\/em>&#8216;dan istifade ederek \u00e7\u00f6z\u00fcm getirebiliriz. Yahut Asp.NET Core&#8217;da gelen default\/build-in IoC container i\u00e7in Castle Windsor&#8217;a benzer automatic factory sorumlulu\u011funu \u00fcstlenmesini sa\u011flayan <em><a href=\"https:\/\/www.nuget.org\/packages\/AspNetCoreInjection.TypedFactories\/\" rel=\"noopener\" target=\"_blank\">AspNetCoreInjection.TypedFactories<\/a><\/em> k\u00fct\u00fcphanesini de kullanabiliriz.<\/p>\n<p>\u015eimdi gelin, her iki k\u00fct\u00fcphane ile automatic factory operasyonunu ger\u00e7ekle\u015ftirelim. Bunun i\u00e7in her iki y\u00f6ntemde de bir \u00f6nceki paragrafta bahsedilen instance y\u00f6netimini sa\u011flayacak olan servisin aray\u00fcz\u00fcn\u00fc tan\u0131mlamam\u0131z gerekmektedir. Bu interface, IoC container&#8217;da istenilen instance&#8217;\u0131 elde edebilmemiz i\u00e7in resolve ederek verebilecek kabiliyette bir aray\u00fcz olacakt\u0131r. Bu aray\u00fczlere <em><strong>factory interface<\/strong><\/em> diyece\u011fiz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IRepositoryFactory\r\n    {\r\n        IOrderRepository CreateOrderRepository();\r\n        IProductRepository CreateProductRepository();\r\n        IUserRepository CreateUserRepository();\r\n    }\r\n<\/pre>\n<\/div>\n<p>Tabi bizler IoC container&#8217;da sadece repository servislerini de\u011fil, di\u011fer servislerimizin instance&#8217;lar\u0131n\u0131 da bar\u0131nd\u0131r\u0131yor olaca\u011f\u0131m\u0131zdan dolay\u0131 bunlar\u0131da farkl\u0131 bir interface ile temsil etmek isteyebiliriz. B\u00f6yle bir durumda istenildi\u011fi kadar factory interface olu\u015fturulabilir.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IServiceFactory\r\n    {\r\n        IRoleManager CreateRoleManager();\r\n        IUserManager CreateUserManager();\r\n    }\r\n<\/pre>\n<\/div>\n<ul>\n<li><strong style=\"color:red;\">AspNetCoreInjection.TypedFactories K\u00fct\u00fcphanesi \u0130le Automatic Factory<\/strong><br \/>\n\u0130lk olarak projeye <a href=\"https:\/\/www.nuget.org\/packages\/AspNetCoreInjection.TypedFactories\/\" rel=\"noopener\" target=\"_blank\">AspNetCoreInjection.TypedFactories<\/a> k\u00fct\u00fcphanesini y\u00fckleyiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler.png\" alt=\"Asp.NET Core - Constructor Injection Hell Durumuna Kar\u015f\u0131l\u0131k Alternatif \u00c7\u00f6z\u00fcmler\" width=\"386\" height=\"43\" class=\"aligncenter size-full wp-image-24582\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler.png 386w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler-300x33.png 300w\" sizes=\"auto, (max-width: 386px) 100vw, 386px\" \/><\/a>Ard\u0131ndan &#8216;Program.cs&#8217; dosyas\u0131na gelerek a\u015fa\u011f\u0131daki register i\u015flemlerini ger\u00e7ekle\u015ftiriniz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nbuilder.Services.RegisterTypedFactory&lt;IRepositoryFactory&gt;()\r\n    .Flavor&lt;IOrderRepository, OrderRepository&gt;()\r\n    .Flavor&lt;IProductRepository, ProductRepository&gt;()\r\n    .Flavor&lt;IUserRepository, UserRepository&gt;()\r\n    .Register();\r\n\r\nbuilder.Services.RegisterTypedFactory&lt;IServiceFactory&gt;()\r\n    .Flavor&lt;IRoleManager, RoleManager&gt;()\r\n    .Flavor&lt;IUserManager, UserManager&gt;()\r\n    .Register();\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Bu i\u015flemlerden sonra tek yap\u0131lmas\u0131 gereken ilgili instance&#8217;lar\u0131n y\u00f6netimini \u00fcstlenen aray\u00fczlerin dependency injection ile talep edilmesi ve bu aray\u00fczler e\u015fli\u011finde hedef instance&#8217;lar\u0131n \u00fcretilmesi i\u00e7in ilgili metotlar\u0131n \u00e7a\u011fr\u0131lmas\u0131d\u0131r.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class FooController : ControllerBase\r\n    {\r\n        private readonly IRepositoryFactory _repositoryFactory;\r\n        private readonly IServiceFactory _serviceFactory;\r\n\r\n        private readonly IProductRepository _productRepository;\r\n        private readonly IOrderRepository _orderRepository;\r\n        private readonly IUserRepository _userRepository;\r\n\r\n        private readonly IRoleManager _roleManager;\r\n        private readonly IUserManager _userManager;\r\n\r\n        public FooController(IRepositoryFactory repositoryFactory, IServiceFactory serviceFactory)\r\n        {\r\n            _repositoryFactory = repositoryFactory;\r\n            _serviceFactory = serviceFactory;\r\n\r\n            _productRepository = _repositoryFactory.CreateProductRepository();\r\n            _orderRepository = _repositoryFactory.CreateOrderRepository();\r\n            _userRepository = _repositoryFactory.CreateUserRepository();\r\n\r\n            _roleManager = _serviceFactory.CreateRoleManager();\r\n            _userManager = _serviceFactory.CreateUserManager();\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar \ud83d\ude42\n<\/li>\n<li><strong style=\"color:red;\">Castle Windsor IoC Container \u0130le Automatic Factory<\/strong><br \/>\nCastle Windsor ile automatic factory&#8217;i ger\u00e7ekle\u015ftirebilmek i\u00e7in \u00f6ncelikle a\u015fa\u011f\u0131daki k\u00fct\u00fcphanelerin projeye y\u00fcklenmesi gerekmektedir.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Castle.FactorySupportFacility\/\" rel=\"noopener\" target=\"_blank\">Castle.FactorySupportFacility<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Castle.Windsor.MsDependencyInjection\/\" rel=\"noopener\" target=\"_blank\">Castle.Windsor.MsDependencyInjection<\/a><\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler-1.png\" alt=\"Asp.NET Core - Constructor Injection Hell Durumuna Kar\u015f\u0131l\u0131k Alternatif \u00c7\u00f6z\u00fcmler\" width=\"437\" height=\"117\" class=\"aligncenter size-full wp-image-24592\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler-1.png 437w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/03\/Asp.NET-Core-Constructor-Injection-Hell-Durumuna-Karsilik-Alternatif-Cozumler-1-300x80.png 300w\" sizes=\"auto, (max-width: 437px) 100vw, 437px\" \/><\/a>Ard\u0131ndan &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki konfig\u00fcrasyon ger\u00e7ekle\u015ftirilmelidir.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nbuilder.Host\r\n    .UseServiceProviderFactory(new WindsorServiceProviderFactory())\r\n    .ConfigureContainer&lt;WindsorContainer&gt;((context, container) =&gt;\r\n    {\r\n        container.Kernel.AddFacility&lt;TypedFactoryFacility&gt;();\r\n        container.Kernel.Register(\r\n            Component.For&lt;IServiceFactory&gt;().AsFactory(),\r\n            Component.For&lt;IRepositoryFactory&gt;().AsFactory()\r\n            );\r\n    });\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Bu konfig\u00fcrasyondan hasbel kader bahsetmemiz gerekirse e\u011fer; 5. sat\u0131rda <code style=\"color:orange;\">UseServiceProviderFactory<\/code> metodu arac\u0131l\u0131\u011f\u0131yla &#8216;WindsorServiceProviderFactory&#8217;nin kullan\u0131laca\u011f\u0131 bildirilmekte ve 6. sat\u0131rda ise container olarak &#8216;WindsorContainer&#8217; eklenerek konfig\u00fcrasyonlar\u0131 ger\u00e7ekle\u015ftirilmektedir. Bu konfig\u00fcrasyonlar, 10 ve 11. sat\u0131rlarda <code style=\"color:orange;\">For<\/code> fonksiyonlar\u0131 ile eklenen instance y\u00f6netiminden sorumlu aray\u00fczlerin eklenmesinden ibarettir.<\/p>\n<p>Tabi Castle Windsor i\u00e7in yap\u0131lan bu konfig\u00fcrasyonda t\u00fcm servislerin IoC container&#8217;a a\u015fa\u011f\u0131daki gibi eklenmesi gerekti\u011fini unutmuyoruz.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services.AddSingleton&lt;IOrderRepository, OrderRepository&gt;();\r\nbuilder.Services.AddSingleton&lt;IProductRepository, ProductRepository&gt;();\r\nbuilder.Services.AddSingleton&lt;IRoleManager, RoleManager&gt;();\r\nbuilder.Services.AddSingleton&lt;IUserManager, UserManager&gt;();\r\nbuilder.Services.AddSingleton&lt;IUserRepository, UserRepository&gt;();\r\n<\/pre>\n<\/div>\n<p>Haliyle geriye bir tek ilgili aray\u00fczlerin inject edilmesi ve servisleri olu\u015fturacak create metotlar\u0131n\u0131n tetiklenmesi kalmaktad\u0131r.<\/p>\n<div style=\"font-size:14px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class FooController : ControllerBase\r\n    {\r\n        private readonly IRepositoryFactory _repositoryFactory;\r\n        private readonly IServiceFactory _serviceFactory;\r\n\r\n        private readonly IProductRepository _productRepository;\r\n        private readonly IOrderRepository _orderRepository;\r\n        private readonly IUserRepository _userRepository;\r\n\r\n        private readonly IRoleManager _roleManager;\r\n        private readonly IUserManager _userManager;\r\n\r\n        public FooController(IRepositoryFactory repositoryFactory, IServiceFactory serviceFactory)\r\n        {\r\n            _repositoryFactory = repositoryFactory;\r\n            _serviceFactory = serviceFactory;\r\n\r\n            _productRepository = _repositoryFactory.CreateProductRepository();\r\n            _orderRepository = _repositoryFactory.CreateOrderRepository();\r\n            _userRepository = _repositoryFactory.CreateUserRepository();\r\n\r\n            _roleManager = _serviceFactory.CreateRoleManager();\r\n            _userManager = _serviceFactory.CreateUserManager();\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte Castle Windsor ile de yap\u0131lmas\u0131 gerekenler bunlar \ud83d\ude42\n<\/li>\n<\/ul>\n<p>Art\u0131k hangi yakla\u015f\u0131m ile automatic factory&#8217;i tercih edersiniz bilemem ama controller s\u0131n\u0131flar\u0131n\u0131n hacmini injection i\u015flemleri i\u00e7in l\u00fczumsuz yere \u015fi\u015firmeksizin constructor injection hell&#8217;e sorumluluk \u00fcstlenen servisler \u00fczerinden \u00e7\u00f6z\u00fcm getirmenin hem keyfine hem de konforuna vard\u0131n\u0131z kanaatindeyim \ud83d\ude42<\/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, Asp.NET Core uygulamalar\u0131nda, s\u0131n\u0131flar\u0131n instance&#8217;lar\u0131n\u0131 Inversion of Control prensibi gere\u011fi y\u00f6netebilmek i\u00e7in IoC Container kullan\u0131lmaktad\u0131r. Bu container sayesinde s\u0131n\u0131f nesnelerinin olu\u015fturulmas\u0131, silinmesi ve kullan\u0131m \u00f6mr\u00fc gibi yap\u0131land\u0131rmalar sa\u011flanarak bu s\u0131n\u0131flara olan ba\u011f\u0131ml\u0131l\u0131k b\u00fcy\u00fck&#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":9596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4446,2739,3102],"tags":[4532,4533,4534,4535,4531,4530,946,1116,1117,4529],"class_list":["post-24561","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-6","category-net-core","category-asp-net-core","tag-10-100-kurali","tag-10-100-rule","tag-aspnetcoreinjection-typedfactories","tag-automatic-factory","tag-constructor-injection-cehennemi","tag-constructor-injection-hell","tag-dependency-injection","tag-inversion-of-control","tag-ioc","tag-ioc-container"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24561","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=24561"}],"version-history":[{"count":35,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24561\/revisions"}],"predecessor-version":[{"id":24600,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24561\/revisions\/24600"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/9596"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}