{"id":142,"date":"2014-09-10T21:54:47","date_gmt":"2014-09-10T18:54:47","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=142"},"modified":"2019-12-16T17:06:35","modified_gmt":"2019-12-16T16:06:35","slug":"ioc-container-nedir","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/ioc-container-nedir\/","title":{"rendered":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131"},"content":{"rendered":"<p>Merhaba arkada\u015flar,<\/p>\n<p>Uzun zamand\u0131r makale yazamad\u0131\u011f\u0131m\u0131 farkettim ve projelerimizde kullan\u0131m kolayl\u0131\u011f\u0131 sa\u011flayacak bir konu ile aray\u0131 peki\u015ftirmek istedim. :)<\/p>\n<p>\u00d6ncelikle nedir bu <strong>IoC Container<\/strong>?<\/p>\n<blockquote><p>A\u00e7\u0131l\u0131m\u0131n\u0131\u00a0<strong>Inversion\u00a0of Control&#8217;<\/strong>den alan IoC Container, uygulaman\u0131n ak\u0131\u015f\u0131 s\u0131ras\u0131nda bize yarat\u0131lmas\u0131 gereken do\u011fru tipi yaratarak, uygulaman\u0131n ak\u0131\u015f\u0131n\u0131 do\u011fru bir \u015fekilde ilerleten \u00f6zel s\u0131n\u0131flard\u0131r.<\/p><\/blockquote>\n<p>K\u0131saca <strong>Dependency Injection<\/strong> ve <strong>Dependency Inversion<\/strong>&#8216;dan bahsetmek gerekirse:<\/p>\n<blockquote><p><strong>Dependency Injection<\/strong> prensibi, uygulama i\u00e7erisindeki bile\u015fenlerin birbirleri ile s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131(<strong>tightly coupled<\/strong>) olmamas\u0131 yani gev\u015fek ba\u011fl\u0131(<strong>loosely coupled<\/strong>) olmas\u0131d\u0131r diyebiliriz.<\/p>\n<p>Dependency Injection ile uygulaman\u0131n\u00a0\u00e7al\u0131\u015faca\u011f\u0131 bile\u015fenleri d\u0131\u015far\u0131dan enjekte\u00a0ederek, ileride olu\u015fabilecek herhangi bir de\u011fi\u015fiklikten minimum seviyede etkinlenmesini sa\u011flam\u0131\u015f oluruz.<\/p>\n<p>&#8212;&#8212;&#8211;<\/p>\n<p><strong>Dependency Inversion<\/strong> ise, &#8220;ba\u011f\u0131ml\u0131l\u0131klar\u0131n tersine \u00e7evrilmesi&#8221; anlam\u0131na gelmektedir. Yani somut s\u0131n\u0131flara olan ba\u011f\u0131ml\u0131l\u0131klar\u0131, soyutlayarak\u00a0ortadan kald\u0131r\u0131lmas\u0131d\u0131r.<\/p>\n<p>Somut s\u0131n\u0131flar\u0131m\u0131z s\u0131k s\u0131k de\u011fi\u015fikli\u011fe u\u011frayabilecekleri i\u00e7in buna ba\u011f\u0131ml\u0131 olan di\u011fer s\u0131n\u0131flar\u0131m\u0131zda\u00a0etkilenecektir.<\/p><\/blockquote>\n<p>Hemen \u00f6rnek kodumuz ile basit bir IoC Container yapal\u0131m ve bir Loglama sistemi geli\u015ftirelim.<\/p>\n<p><strong>GokFramework.IoCContainer\u00a0<\/strong>isminde bir yeni proje ekleyip i\u00e7ine\u00a0<strong>IoCResolver.cs<\/strong> isminde bir class olu\u015fturuyorum.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing System.Linq;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\n\r\nnamespace GokFramework.IoCContainer\r\n{\r\n    public class IoCResolver\r\n    {\r\n        #region Constructor\r\n        private static object objLock = new object();\r\n        private static IoCResolver m_IoCResolver;\r\n        public static IoCResolver getInstance\r\n        {\r\n            get\r\n            {\r\n                if (m_IoCResolver == null)\r\n                {\r\n                    lock (objLock)\r\n                    {\r\n                        if (m_IoCResolver == null)\r\n                            m_IoCResolver = new IoCResolver();\r\n                    }\r\n                }\r\n\r\n                return m_IoCResolver;\r\n            }\r\n            set { m_IoCResolver = value; }\r\n        }\r\n\r\n        #endregion\r\n\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ Injection of control\r\n        \/\/\/ &lt;\/summary&gt;\r\n        \/\/\/ &lt;typeparam name=\"TSource\"&gt;Injection yap\u0131lacak class type.&lt;\/typeparam&gt;\r\n        \/\/\/ &lt;typeparam name=\"TDestination\"&gt;Injection edilecek class type.&lt;\/typeparam&gt;\r\n        \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n        public void Resolve&lt;TSource, TDestination&gt;()\r\n        {\r\n            object dependencyForInstance, implementedByInstance;\r\n            dependencyForInstance = Activator.CreateInstance(typeof(TSource));\r\n            implementedByInstance = Activator.CreateInstance(typeof(TDestination));\r\n\r\n            foreach (var pi in dependencyForInstance.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Static))\r\n            {\r\n                var piList = implementedByInstance.GetType().GetInterfaces().Where(x =&gt; x.Name.Equals(pi.FieldType.Name)).ToList();\r\n                if (piList.Count &gt; 0)\r\n                { pi.SetValue(dependencyForInstance, implementedByInstance); break; }\r\n            }\r\n        }\r\n    }\r\n}<\/pre>\n<p>Class&#8217;\u0131m\u0131za bakt\u0131\u011f\u0131m\u0131zda, \u00f6ncelikle\u00a0<strong>constructor<\/strong>&#8216;\u0131m\u0131zda <strong>Singleton<\/strong> Patternini uygulad\u0131\u011f\u0131m\u0131z\u0131 g\u00f6r\u00fcyoruz tekilli\u011fini sa\u011flamak i\u00e7in.<\/p>\n<p><strong>Resolve<\/strong> isminde bir method olu\u015fturarak iki tip al\u0131yoruz\u00a0<strong>TSource<\/strong> ve\u00a0<strong>TDestination<\/strong> olarak.\u00a0<strong>TSource<\/strong> burada enjekte\u00a0yap\u0131lacak class&#8217;\u0131m\u0131z\u0131 temsil ederken,\u00a0<strong>TDestination<\/strong> ise enjekte edilecek\u00a0concrete class&#8217;\u0131m\u0131z\u0131\u00a0temsil ediyor.<\/p>\n<p>Runtime&#8217;da instancelerini alarak,\u00a0<strong>dependencyForInstance<\/strong> objemizin yani\u00a0<strong>TSource<\/strong>&#8216;umuzun field&#8217;lar\u0131nda (Birazdan loglama geli\u015ftirme k\u0131sm\u0131nda inceleyece\u011fimiz Loglama context&#8217;imizdeki <strong>ILogger<\/strong> property&#8217;mizin <strong>private static<\/strong> oldu\u011fu i\u00e7in field&#8217;lar\u0131n\u0131 al\u0131yoruz) dolanarak enjekte\u00a0yap\u0131lacak\u00a0class&#8217;\u0131m\u0131z\u0131n (TSource) i\u00e7indeki, d\u0131\u015far\u0131dan enjekte\u00a0edilecek\u00a0class tipini\u00a0bularak, varsa:<\/p>\n<pre class=\"lang:c# decode:true \">implementedByInstance.GetType().GetInterfaces().Where(x =&gt; x.Name.Equals(pi.FieldType.Name))<\/pre>\n<p>SetValue methodu ile\u00a0<strong>TSource&#8217;umuza<\/strong>,\u00a0d\u0131\u015far\u0131dan enjekte\u00a0edilecek\u00a0s\u0131n\u0131f\u0131n <strong>instance&#8217;sini<\/strong> set ediyoruz. Loglama context&#8217;imizdeki <strong>ILogger<\/strong> property&#8217;mizi static olarak tan\u0131mlad\u0131\u011f\u0131m\u0131z i\u00e7in, instance&#8217;si\u00a0ram bellekte saklanacakt\u0131r ve\u00a0dolay\u0131s\u0131yla\u00a0uygulamam\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 boyunca loglama sistemimizi kullanabiliriz. Tekrardan d\u0131\u015far\u0131dan bir tipi enjekte\u00a0etme ihtiyac\u0131 duymay\u0131z.\u00a0B\u00f6ylelikle hem\u00a0kod tekrar\u0131ndan kurtulmu\u015f olduk, hemde generic bir \u015fekilde tekrar kullan\u0131labilirli\u011fini artt\u0131rd\u0131k.<\/p>\n<p><strong>IoC Container<\/strong> tasar\u0131m\u0131m\u0131z i\u015fte bu kadar. :) Art\u0131k istedi\u011fimiz zaman uygulamam\u0131z\u0131n Application_Start&#8217;\u0131nda veya Main&#8217;inde bir kere enjekte\u00a0etmemiz yetecektir.<\/p>\n<p>&nbsp;<\/p>\n<p>Hemen basit bir Loglama sistemimizi tasarlayal\u0131m:<\/p>\n<p><strong>GokFramework.Logger\u00a0<\/strong>isminde yeni bir proje daha ekleyerek, Log sistemimizi soyutlamak i\u00e7in\u00a0<strong>ILogger<\/strong> isminde bir interface ekliyorum.<\/p>\n<pre class=\"lang:c# decode:true \">using System.Reflection;\r\n\r\nnamespace GokFramework.Logger\r\n{\r\n    public interface ILogger\r\n    {\r\n        void Log(MethodBase methodBase, string message);\r\n    }\r\n}\r\n<\/pre>\n<p>MethodBase&#8217;i isteyerek hangi class&#8217;dan\u00a0ve method&#8217;dan \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 yakalayabilece\u011fiz\u00a0loglama s\u0131ras\u0131nda ve log tutulacak\u00a0mesaj\u0131m\u0131z.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>FileLogger<\/strong> isminde bir yeni class ekleyerek <strong>ILogger<\/strong> interface&#8217;mizi implemente ediyoruz. FileLogger burada <strong>concrete<\/strong> class&#8217;\u0131m\u0131z oluyor.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Configuration;\r\nusing System.IO;\r\nusing System.Reflection;\r\n\r\nnamespace GokFramework.Logger\r\n{\r\n    public class FileLogger : ILogger\r\n    {\r\n        public void Log(MethodBase methodBase, string message)\r\n        {\r\n            string logPath = ConfigurationManager.AppSettings[\"GokFramework.LoggerPath\"].TrimEnd('\/');\r\n            string logName = DateTime.Now.ToString(\"yyyyMMdd_HHmm\") + \".txt\";\r\n            string logMessage = string.Format(\"Namaspace: {0}\\r\\nClass: {1}\\r\\nMethod: {2}\\r\\nMessage: {3}\",\r\nmethodBase.ReflectedType.Namespace, methodBase.ReflectedType.Name, methodBase.Name, message);\r\n            string path = System.IO.Path.Combine(logPath, logName);\r\n\r\n            if (!Directory.Exists((logPath)))\r\n                Directory.CreateDirectory(logPath);\r\n\r\n            StreamWriter sw = new StreamWriter(path, true);\r\n            sw.WriteLine(logMessage);\r\n            sw.Close();\r\n            sw.Dispose();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Basit olarak bir log tutma methodu yaz\u0131yorum, tarihe g\u00f6re bir txt dosyas\u0131 olu\u015fturarak, hangi <strong>namespace&#8217;den<\/strong> ve <strong>method&#8217;dan<\/strong> \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131 gibi i\u00e7eri\u011fi tutaca\u011f\u0131z.<\/p>\n<p>Log tutulacak path&#8217;imizi<strong> App.Config<\/strong> dosyas\u0131ndan &#8220;GokFramework.LoggerPath&#8221; key&#8217;i ile okuyorum.<\/p>\n<p>&nbsp;<\/p>\n<p>Hemen ard\u0131ndan\u00a0<strong>LoggerContext<\/strong> isminde bir class daha ekleyerek kodlamaya ge\u00e7iyorum.<\/p>\n<pre class=\"lang:c# decode:true\">using System.Reflection;\r\n\r\nnamespace GokFramework.Logger\r\n{\r\n    public class LoggerContext\r\n    {\r\n        #region Properties\r\n        private static ILogger Logger { get; set; }\r\n        #endregion\r\n\r\n        public static void Log(MethodBase methodBase, string message)\r\n        {\r\n            Logger.Log(methodBase, message);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Log sistemimizi LoggerContext ile sarmalayarak, <strong>Logger<\/strong> isminde ve <strong>ILogger<\/strong> tipinde bir static property tan\u0131ml\u0131yoruz. B\u00f6ylelikle LoggerContext&#8217;imizin ILogger tipinden gelecek olan Loglama <strong>concrete<\/strong> class&#8217;\u0131m\u0131z ile s\u0131k\u0131 ba\u011fl\u0131l\u0131\u011f\u0131n\u0131 engellemi\u015f\u00a0oluyoruz.<\/p>\n<p>\u0130leride gelecek olan FileLogger haricinde yeni geli\u015ftirmelerin \u00f6rne\u011fin, MailLogger, SmsLogger gibi <strong>concrete<\/strong> class&#8217;lar\u0131m\u0131z\u0131da kolayl\u0131kla sistemimize dahil edebilmemizi sa\u011flam\u0131\u015f olacak. Asl\u0131nda burada <strong>Strategy patterni<\/strong> uygulam\u0131\u015f olduk.<\/p>\n<p>Bir log tutma i\u015fimiz var ve bunu tutabilmek i\u00e7in birden fazla algoritmam\u0131z var.<\/p>\n<p>&nbsp;<\/p>\n<p>Hemen kullan\u0131mlar\u0131na ge\u00e7elim.<\/p>\n<p>\u00d6rnek bir console uygulamas\u0131 olu\u015fturarak Program.cs&#8217;in i\u00e7erisinde kodlamaya ba\u015fl\u0131yorum.<\/p>\n<pre class=\"lang:c# decode:true \">using GokFramework.IoCContainer;\r\nusing GokFramework.Logger;\r\nusing System.Reflection;\r\n\r\nnamespace GokFramework.ConsoleForTest\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {          \r\n            #region Logger Test\r\n            \/\/ Application_Start'da bir kere \u00e7al\u0131\u015ft\u0131r\u0131lacak, injection i\u00e7in.\r\n            IoCResolver.getInstance.Resolve&lt;LoggerContext, FileLogger&gt;();\r\n\r\n            \/\/ T\u00fcm projede injection yap\u0131lan tipte \u00e7al\u0131\u015facakt\u0131r.\r\n            LoggerContext.Log(MethodBase.GetCurrentMethod(), \"blabla\");\r\n            #endregion\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Kullan\u0131m\u0131 bu kadar basit.<\/p>\n<p>Uygulamam\u0131zda hangi tipte log tutmak istiyorsak sadece bir kere Resolve etmemiz yeterli. Burada <strong>LoggerContext<\/strong> yani i\u00e7erisinde <strong>ILogger&#8217;imizi<\/strong> bar\u0131nd\u0131ran class&#8217;\u0131m\u0131z yani <strong>TSource\u00a0<\/strong>oluyor, enjecte yap\u0131lacak class&#8217;\u0131m\u0131z.<\/p>\n<p><strong>FileLogger<\/strong> ise d\u0131\u015far\u0131dan <strong>ILogger&#8217;a<\/strong> enjekte edilecek concrete class&#8217;\u0131m\u0131z yani <strong>TDestination<\/strong>. Bu MailLogger&#8217;da olabilir, SmsLogger&#8217;da.<\/p>\n<p>&nbsp;<\/p>\n<p>Umar\u0131m yararl\u0131 bir konu olmu\u015ftur. \u00d6rnek kodlar ektedir. :)<\/p>\n<p><a href=\"\/wp-content\/uploads\/2014\/09\/GokFramework.rar\">GokFramework<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, Uzun zamand\u0131r makale yazamad\u0131\u011f\u0131m\u0131 farkettim ve projelerimizde kullan\u0131m kolayl\u0131\u011f\u0131 sa\u011flayacak bir konu ile aray\u0131 peki\u015ftirmek istedim. :) \u00d6ncelikle nedir bu IoC Container? A\u00e7\u0131l\u0131m\u0131n\u0131\u00a0Inversion\u00a0of Control&#8217;den alan IoC Container, uygulaman\u0131n ak\u0131\u015f\u0131 s\u0131ras\u0131nda bize yarat\u0131lmas\u0131 gereken do\u011fru tipi yaratarak, uygulaman\u0131n ak\u0131\u015f\u0131n\u0131 do\u011fru bir \u015fekilde ilerleten \u00f6zel&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/ioc-container-nedir\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,21],"tags":[25,26,24,22,27,28,4,23],"class_list":["post-142","post","type-post","status-publish","format-standard","hentry","category-net","category-tasarim-prensipleri-design-principles","tag-dependency-injection","tag-dependency-inversion","tag-ioc-container","tag-logger","tag-loosely-coupled","tag-object-oriented-prensipleri","tag-reflection","tag-strategy-pattern","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2014-09-10T18:54:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-12-16T16:06:35+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131\",\"datePublished\":\"2014-09-10T18:54:47+00:00\",\"dateModified\":\"2019-12-16T16:06:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/\"},\"wordCount\":777,\"commentCount\":6,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"Dependency Injection\",\"Dependency Inversion\",\"IoC Container\",\"Logger\",\"Loosely Coupled\",\"object oriented prensipleri\",\"Reflection\",\"Strategy Pattern\"],\"articleSection\":[\".NET\",\"Tasar\u0131m Prensipleri (Design Principles)\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/\",\"name\":\"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2014-09-10T18:54:47+00:00\",\"dateModified\":\"2019-12-16T16:06:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/ioc-container-nedir\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/ioc-container-nedir\/","og_locale":"tr_TR","og_type":"article","og_title":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2014-09-10T18:54:47+00:00","article_modified_time":"2019-12-16T16:06:35+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"5 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131","datePublished":"2014-09-10T18:54:47+00:00","dateModified":"2019-12-16T16:06:35+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/"},"wordCount":777,"commentCount":6,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["Dependency Injection","Dependency Inversion","IoC Container","Logger","Loosely Coupled","object oriented prensipleri","Reflection","Strategy Pattern"],"articleSection":[".NET","Tasar\u0131m Prensipleri (Design Principles)"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/","url":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/","name":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131 - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2014-09-10T18:54:47+00:00","dateModified":"2019-12-16T16:06:35+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/ioc-container-nedir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Basit bir IoC Container ve Loglama sistemi yap\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=142"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/142\/revisions"}],"predecessor-version":[{"id":3036,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/142\/revisions\/3036"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}