﻿
{"id":9598,"date":"2018-09-28T10:05:03","date_gmt":"2018-09-28T10:05:03","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=9598"},"modified":"2018-09-28T10:05:03","modified_gmt":"2018-09-28T10:05:03","slug":"asp-net-core-2-mvcde-dependency-injection","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2-mvcde-dependency-injection\/","title":{"rendered":"Asp.NET Core 2 MVC&#8217;de Dependency Injection"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>.NET mimarisi devrim niteli\u011finde .NET Core mimarisine yapt\u0131\u011f\u0131 ge\u00e7i\u015fle Asp.NET Core mimarisinde de olduk\u00e7a radikal boyutta de\u011fi\u015fikliklerle bir tek IIS yahut platform ba\u011f\u0131ml\u0131l\u0131\u011f\u0131ndan kendini soyutlamamakta, programatik a\u00e7\u0131dan da t\u00fcm ba\u011f\u0131ml\u0131l\u0131\u011fa ayk\u0131r\u0131 olan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/dependency-injection-nedir-nasil-uygulanir\/\" rel=\"noopener\" target=\"_blank\">Dependency Injection<\/a> alt yap\u0131s\u0131nda bir yakla\u015f\u0131m sunmaktad\u0131r. Bu i\u00e7eri\u011fimizde Asp.NET Core 2 MVC projesinde Dependency Injection mant\u0131\u011f\u0131n\u0131 inceleyecek ve teknik boyutta bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 y\u00f6netmemizi sa\u011flayan \u00fc\u00e7 farkl\u0131 yordam\u0131 tek tek de\u011ferlendirerek ihtiyaca d\u00f6n\u00fck farklar\u0131n\u0131 mukayese neticesinde netle\u015ftirip makalemizi noktalayaca\u011f\u0131z.<\/p>\n<p>Asp.NET Core 2 MVC mimarisinde bir s\u0131n\u0131f\u0131n constructer metodundan talep edilen parametreye g\u00f6nderilecek nesneleri alt yap\u0131sal olarak Dependency Injection \u00f6zelli\u011fi sayesinde \u00f6nceden belirleyebiliyoruz ve yap\u0131sal olarak ilgili s\u0131n\u0131ftan \u00fcretilecek instancelarda parametredeki referans tipine olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ortadan kald\u0131rabiliyoruz.<\/p>\n<p>Bu teori\u011fi g\u00f6z\u00fcn\u00fczde daha da canland\u0131rabilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6rneklendirelim.<br \/>\nVarsayal\u0131m ki, elimizde bir interface&#8217;imiz olsun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IOperation\r\n    {\r\n        string GetValue();\r\n    }\r\n<\/pre>\n<p>Bu interface&#8217;den a\u015fa\u011f\u0131daki gibi bir Controller s\u0131n\u0131f\u0131n\u0131n constructer\u0131ndan parametre ile nesne talep etti\u011fimizi d\u00fc\u015f\u00fcnelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        IOperation _operation;\r\n        public HomeController(IOperation operation)\r\n        {\r\n            _operation = operation;\r\n        }\r\n        public IActionResult Index()\r\n        {\r\n            ViewBag.Value = _operation.GetValue();\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu \u015fekilde ilgili projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z zaman &#8220;_operation&#8221; referans\u0131n\u0131n null oldu\u011funa dair bir hata ile kar\u015f\u0131la\u015faca\u011f\u0131z. Do\u011frusu \u015fu durumda bu hatay\u0131 almam\u0131z gayet do\u011fal. \u00c7\u00fcnk\u00fc compiler bize &#8220;<em>babac\u0131\u011f\u0131m bu IOperation tipinden _operation referans\u0131n\u0131n nesnesini vermeden kullanamazs\u0131n<\/em>&#8221; demektedir. Dolay\u0131s\u0131yla bizim b\u00f6yle bir durumda ilgili tipte bir talep geldi\u011fi zaman &#8220;\u015fu&#8221; nesneyi g\u00f6nder dememiz ve tipe olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 soyutlamam\u0131z gerekmektedir.<\/p>\n<p>Bu i\u015flem i\u00e7in projede ki &#8220;Startup.cs&#8221; s\u0131n\u0131f\u0131 i\u00e7erisinde &#8220;ConfigureServices&#8221; metodunda a\u015fa\u011f\u0131dakine benzer bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirmemiz yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddTransient&lt;IOperation, Operation&gt;();\r\n\r\n            services.AddMvc();\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Dikkat ederseniz &#8220;services&#8221; parametresine generic &#8220;AddTransient&#8221; metodu ile &#8220;IOperation&#8221; tipinden gelen taleplerde &#8220;Operation&#8221; nesnesi d\u00f6nd\u00fcrmesini belirtmi\u015f bulunuyoruz. Tabi burada &#8220;Operation&#8221; nesnesi &#8220;IOperation&#8221; interface&#8217;inden a\u015fa\u011f\u0131daki gibi t\u00fcremesi \u015fart\u0131yla&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Operation : IOperation\r\n    {\r\n        string _value = &quot;Operation&quot;;\r\n        public string GetValue() =&gt; _value;\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemden sonra projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda &#8220;Home(Controller).cs&#8221; controller\u0131n\u0131n constructer\u0131ndan talep edilen &#8220;IOperation&#8221; tipinden parametreye &#8220;Operation&#8221; nesnesi sistem taraf\u0131ndan direkt d\u00f6nd\u00fcr\u00fclece\u011finden dolay\u0131 hatas\u0131z olarak a\u00e7\u0131lacakt\u0131r.<\/p>\n<p>Bu noktada akl\u0131n\u0131zdan <strong>La hoca! ya Operation nesnesininde constructer\u0131 parametre al\u0131yorsa?<\/strong> sorusunun ge\u00e7ti\u011fini duyar gibiyim&#8230; Tamam&#8230; Diyelim ki dedi\u011finiz gibi d\u00fc\u015f\u00fcnelim ve &#8220;Operation&#8221; s\u0131n\u0131f\u0131 constructer\u0131nda a\u015fa\u011f\u0131daki gibi parametre al\u0131yor olsun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Operation : IOperation\r\n    {\r\n        public Operation(string value) =&gt; _value = value;\r\n        string _value = &quot;Operation&quot;;\r\n        public string GetValue() =&gt; _value;\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte b\u00f6yle bir durumda &#8220;Startup.cs&#8221; s\u0131n\u0131f\u0131nda;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            \/\/services.AddTransient&lt;IOperation, Operation&gt;();\r\n            services.AddTransient&lt;IOperation&gt;(i =&gt; new Operation(&quot;Constructer value&quot;));\r\n\r\n            services.AddMvc();\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>\u015feklinde \u00e7al\u0131\u015fmam\u0131z\u0131 ger\u00e7ekle\u015ftirebiliriz. Burada &#8220;IOperation&#8221; tipinden bir talepte bulunuldu\u011fu zaman &#8220;\u015fu&#8221; nesneyi \u015fu ayarlarda g\u00f6nder demi\u015f bulunmaktay\u0131z.<\/p>\n<p>Bu noktaya kadar Asp.NET Core 2 MVC&#8217;de Dependency Injection yakla\u015f\u0131m\u0131n\u0131n nas\u0131l oldu\u011funu de\u011ferlendirmi\u015f ve san\u0131r\u0131m netle\u015ftirmi\u015f olduk. \u015eimdi &#8220;Startup&#8221; s\u0131n\u0131f\u0131 i\u00e7erisindeki &#8220;ConfigureServices&#8221; isimli metot i\u00e7erisinde uygulamaya dahil edilen nesneleri &#8220;AddTransient&#8221; fonksiyonu d\u0131\u015f\u0131nda &#8220;AddScoped&#8221; ve &#8220;AddSingleton&#8221; fonksiyonlar\u0131 arac\u0131l\u0131\u011f\u0131ylada dahil edebilmekteyiz. \u015eimdi gelin <em><strong>bu metotlar\u0131n aras\u0131ndaki farklar nelerdir?<\/strong><\/em> sorusunun cevab\u0131n\u0131 inceleyelim.<\/p>\n<table>\n<thead>\n<tr>\n<th>AddTransient<\/th>\n<th>AddScoped<\/th>\n<th>AddSingleton<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Her talepte yeni ve ge\u00e7ici bir nesne \u00fcretir.<\/td>\n<td>Bir talebe\/request \u00f6zel nesne \u00fcretir. Sadece o requeste \u00f6zel nesne olu\u015fturulur.<\/td>\n<td>Her talep i\u00e7in ilk \u00fcretilen nesneyi d\u00f6nd\u00fcr\u00fcr. Uygulaman\u0131n her noktas\u0131ndan \u00fcretilmi\u015f mevcut nesneye eri\u015filir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u015eimdi bu metotlar\u0131 \u00f6rneklendirmek i\u00e7in \u00f6zel interface yap\u0131lar\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IOperationTransient : IOperation\r\n    {\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IOperationScoped : IOperation\r\n    {\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IOperationSingleton : IOperation\r\n    {\r\n    }\r\n<\/pre>\n<p>\u00d6rneklendirmeyi genelle\u015ftirilmi\u015f yapabilmek i\u00e7in &#8220;Operation&#8221; nesnemizi bu interfacelerden t\u00fcretelim ve bir yandan da bo\u015f constructer olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Operation : IOperation, IOperationTransient, IOperationScoped, IOperationSingleton\r\n    {\r\n        public Operation() { }\r\n        public Operation(string value) =&gt; _value = value;\r\n        string _value = &quot;Operation&quot;;\r\n        public string GetValue() =&gt; _value;\r\n    }\r\n<\/pre>\n<p>Bu olu\u015fumlardan sonra &#8220;Home(Controller).cs&#8221; isimli controller s\u0131n\u0131m\u0131f\u0131z\u0131n controller\u0131nda a\u015fa\u011f\u0131daki gibi nesne taleplerinde bulunal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        IOperation _operation;\r\n        IOperationTransient _operationTransient;\r\n        IOperationScoped _operationScoped;\r\n        IOperationSingleton _operationSingleton;\r\n        public HomeController(IOperation operation,\r\n            IOperationTransient operationTransient,\r\n            IOperationScoped operationScoped,\r\n            IOperationSingleton operationSingleton)\r\n        {\r\n            _operation = operation;\r\n            _operationTransient = operationTransient;\r\n            _operationScoped = operationScoped;\r\n            _operationSingleton = operationSingleton;\r\n        }\r\n\r\n        public IActionResult Index()\r\n        {\r\n            ViewBag.ValueOperation = _operation.GetValue();\r\n            ViewBag.ValueOperationTransient = _operationTransient.GetValue();\r\n            ViewBag.ValueOperationScoped = _operationScoped.GetValue();\r\n            ViewBag.ValueOperationSingleton = _operationSingleton.GetValue();\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015eimdi bu taleplere kar\u015f\u0131 ilgili nesnelerini g\u00f6nderelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            \/\/IOperation tipine varsay\u0131lan nesne tipi at\u0131yoruz.\r\n            services.AddTransient&lt;IOperation, Operation&gt;();\r\n            services.AddTransient&lt;IOperationTransient, Operation&gt;();\r\n            services.AddScoped&lt;IOperationScoped, Operation&gt;();\r\n            services.AddSingleton&lt;IOperationSingleton, Operation&gt;();\r\n\r\n            services.AddMvc();\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Bu \u015fekilde projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda, kullan\u0131lan fonksiyonun i\u015fleyi\u015fine g\u00f6re her bir tipe \u00f6zel nesne \u00fcretilip talebin oldu\u011fu noktaya g\u00f6nderilecektir.<\/p>\n<p>\u00dcretilen nesnelerin hangi fonksiyonellikle \u00fcretildiklerini tasdiklemek i\u00e7in a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fmada ger\u00e7ekle\u015ftirilebilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            \/\/IOperation tipine varsay\u0131lan nesne tipi at\u0131yoruz.\r\n            services.AddTransient&lt;IOperation&gt;(i =&gt; new Operation($&quot;Created for {nameof(IOperation)}&quot;));\r\n            services.AddTransient&lt;IOperationTransient&gt;(i =&gt; new Operation($&quot;Created for {nameof(IOperationTransient)}&quot;));\r\n            services.AddScoped&lt;IOperationScoped&gt;(i =&gt; new Operation($&quot;Created for {nameof(IOperationScoped)}&quot;));\r\n            services.AddSingleton&lt;IOperationSingleton&gt;(i =&gt; new Operation($&quot;Created for {nameof(IOperationSingleton)}&quot;));\r\n\r\n            services.AddMvc();\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>&#8220;Index.cshtml&#8221; dosyam\u0131zda da a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fma yaparsak e\u011fer;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&lt;h3&gt;@ViewBag.ValueOperation&lt;\/h3&gt;\r\n&lt;h3&gt;@ViewBag.ValueOperationTransient&lt;\/h3&gt;\r\n&lt;h3&gt;@ViewBag.ValueOperationScoped&lt;\/h3&gt;\r\n&lt;h3&gt;@ViewBag.ValueOperationSingleton&lt;\/h3&gt;\r\n<\/pre>\n<p>projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi sonu\u00e7la kar\u015f\u0131la\u015faca\u011f\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Dependency-Injection.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Dependency-Injection.png\" alt=\"Asp.NET Core 2 MVC&#039;de Dependency Injection\" width=\"277\" height=\"188\" class=\"aligncenter size-full wp-image-9621\" \/><\/a><\/p>\n<p>Buradan da anla\u015f\u0131lan her bir nesne amac\u0131na uygun bir \u015fekilde Dependency Injection alt yap\u0131s\u0131yla \u00fcretilmektedir. Bu yap\u0131 bizlere m\u00fckemmel tasar\u0131m esneklik sa\u011flamakta ve l\u00fczumsuz kod yap\u0131s\u0131ndan da m\u00fcmk\u00fcn mertebe ar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki 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, .NET mimarisi devrim niteli\u011finde .NET Core mimarisine yapt\u0131\u011f\u0131 ge\u00e7i\u015fle Asp.NET Core mimarisinde de olduk\u00e7a radikal boyutta de\u011fi\u015fikliklerle bir tek IIS yahut platform ba\u011f\u0131ml\u0131l\u0131\u011f\u0131ndan kendini soyutlamamakta, programatik a\u00e7\u0131dan da t\u00fcm ba\u011f\u0131ml\u0131l\u0131\u011fa ayk\u0131r\u0131 olan Dependency&#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":[2656],"tags":[2661,2660,2659,2651,2662,946],"class_list":["post-9598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2-mvc","tag-addscoped","tag-addsingleton","tag-addtransient","tag-asp-net-core-2-mvc","tag-asp-net-core-dependency-injection","tag-dependency-injection"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9598","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=9598"}],"version-history":[{"count":24,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9598\/revisions"}],"predecessor-version":[{"id":9623,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9598\/revisions\/9623"}],"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=9598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=9598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=9598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}