﻿
{"id":14162,"date":"2020-03-14T19:39:08","date_gmt":"2020-03-14T19:39:08","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=14162"},"modified":"2020-03-14T19:39:08","modified_gmt":"2020-03-14T19:39:08","slug":"asp-net-core-options-pattern","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-options-pattern\/","title":{"rendered":"Asp.NET Core &#8211; Options Pattern"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Asp.NET Core, konfig\u00fcrasyonel ayarlar\u0131 uygulamaya h\u0131zl\u0131 bir \u015fekilde enjekte edebilmemiz i\u00e7in Options Pattern&#8217;i bizlere sunmaktad\u0131r. Bu desen sayesinde &#8220;appsettings.json&#8221; dosyas\u0131ndaki kay\u0131tlar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u015fekilde uygulamaya Dependency Injection ile dahil edebilmekte ve pratik bir \u015fekilde talep ederek, kullanabilmekteyiz.<\/p>\n<p>H\u0131zl\u0131 bir \u00f6rneklendirme yapabilmek i\u00e7in herhangi bir Asp.NET Core uygulamas\u0131ndaki &#8220;appsettings.json&#8221; dosyas\u0131nda a\u015fa\u011f\u0131daki formatta kay\u0131tlar tutal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;Logging&quot;: {\r\n    &quot;LogLevel&quot;: {\r\n      &quot;Default&quot;: &quot;Information&quot;,\r\n      &quot;Microsoft&quot;: &quot;Warning&quot;,\r\n      &quot;Microsoft.Hosting.Lifetime&quot;: &quot;Information&quot;\r\n    }\r\n  },\r\n  &quot;AllowedHosts&quot;: &quot;*&quot;,\r\n  &quot;Teacher&quot;: {\r\n    &quot;Name&quot;: &quot;Gen\u00e7ay&quot;,\r\n    &quot;No&quot;: 110355,\r\n    &quot;Lessons&quot;: &#x5B;\r\n      {\r\n        &quot;Name&quot;: &quot;C#&quot;\r\n      },\r\n      {\r\n        &quot;Name&quot;: &quot;Asp.NET Core&quot;\r\n      },\r\n      {\r\n        &quot;Name&quot;: &quot;SQL Server&quot;\r\n      }\r\n    ]\r\n  }\r\n}\r\n\r\n<\/pre>\n<p>Yukar\u0131daki &#8220;appsettings.json&#8221; dosyas\u0131n\u0131n i\u00e7eri\u011finde 10. sat\u0131rdaki kayda bakarsan\u0131z bir \u00f6\u011fretmene dair bilgileri bar\u0131nd\u0131ran json format yap\u0131s\u0131n\u0131 g\u00f6receksiniz. Uygulamada bu kay\u0131tlara ihtiyac\u0131m\u0131z oldu\u011fu taktirde Options Pattern olmaks\u0131z\u0131n a\u015fa\u011f\u0131daki y\u00f6ntemle uzun uzun ilgili verileri elde edebilmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        IConfiguration _configuration;\r\n        public HomeController(IConfiguration configuration)\r\n        {\r\n            string teacher = configuration.GetSection(&quot;Teacher&quot;).Value;\r\n            string teacherName = configuration.GetSection(&quot;Teacher:Name&quot;).Value;\r\n            string teacher1Lesson = configuration.GetSection(&quot;Teacher:Lessons:0:Name&quot;).Value;\r\n            string teacher2Lesson = configuration.GetSection(&quot;Teacher:Lessons:1:Name&quot;).Value;\r\n        }\r\n    }\r\n<\/pre>\n<p>ya da bu verileri kar\u015f\u0131layacak bir model tasarlayarak a\u015fa\u011f\u0131daki \u015fekilde de \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirebiliriz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Teacher\r\n    {\r\n        public int No { get; set; }\r\n        public string Name { get; set; }\r\n        public List&lt;Lesson&gt; Lessons { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Lesson\r\n    {\r\n        public string Name { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        IConfiguration _configuration;\r\n        public HomeController(IConfiguration configuration)\r\n        {\r\n            Teacher teacher = configuration.GetSection(&quot;Teacher&quot;).Get&lt;Teacher&gt;();\r\n        }\r\n    }\r\n<\/pre>\n<p>Evet, genellikle config\u00fcrasyon ayarlar\u0131yla birlikte statik verilerin tutuldu\u011fu dosya olan &#8220;appsettings.json&#8221; i\u00e7erisinde verileri bu y\u00f6ntemlerle basit\u00e7e edinebilmekte ve kullanabilmekteyiz. <strong>Madem bu y\u00f6ntemlerle kay\u0131tlar elde edilebiliyor, bu makale neyin nesi hoca?<\/strong> diye s\u00f6ylendi\u011finizi duyar gibiyim&#8230;<\/p>\n<p>D\u00fc\u015f\u00fcnsenize&#8230; &#8220;appsettings.json&#8221; i\u00e7erisindeki veriler bir iki yerde kullan\u0131lacaksa yukar\u0131daki y\u00f6ntemlerden herhangi biriyle elde edilebilir ve tabi ki de bu y\u00f6ntemler tercih edilmelidir. Ancak uygulamada birden fazla yerde kullan\u0131lacak veriler mevzu bahis oldu\u011fu durumlarda her veri okuma i\u015flemini bu y\u00f6ntemlerle ger\u00e7ekle\u015ftirmek \u00e7ok fazla kod tekrar\u0131na sebep olacak ve clean code mant\u0131\u011f\u0131na ayk\u0131r\u0131 bir durum do\u011furacakt\u0131r.<\/p>\n<p>\u0130\u015fte bu tarz bir durumda Options Pattern stratejisi devreye girerek, uygulamada a\u015f\u0131r\u0131 kullan\u0131lacak verileri kendilerine uygun tasarlanm\u0131\u015f class modellerinden t\u00fcretilen nesnelere yerle\u015ftirip ard\u0131ndan bu nesneleri uygulaman\u0131n dependency injection sa\u011flay\u0131c\u0131s\u0131na atanmas\u0131n\u0131 ve istenildi\u011fi zaman ba\u011f\u0131ms\u0131z bir yakla\u015f\u0131mla elde edilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>Stratejinin uygulanabilmesi i\u00e7in \u00f6ncelikle &#8220;appsettings.json&#8221; dosyas\u0131ndaki veriyi temsil edecek olan s\u0131n\u0131flar tasarlanmal\u0131d\u0131r. Bunun i\u00e7in yukar\u0131da tan\u0131mlad\u0131\u011f\u0131m\u0131z &#8220;Teacher&#8221; ve &#8220;Lesson&#8221; s\u0131n\u0131flar\u0131 \u00f6rneklendirmemiz i\u00e7in do\u011fru tasarlanm\u0131\u015ft\u0131r. \u0130lgili s\u0131n\u0131flar\u0131 tekrar a\u015fa\u011f\u0131ya al\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Teacher\r\n    {\r\n        public int No { get; set; }\r\n        public string Name { get; set; }\r\n        public List&lt;Lesson&gt; Lessons { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Lesson\r\n    {\r\n        public string Name { get; set; }\r\n    }\r\n<\/pre>\n<p>Burada dikkat edilmesi gereken tek husus, options pattern&#8217;in json format\u0131ndaki verileri class instance&#8217;\u0131na ta\u015f\u0131rken alan e\u015fle\u015fmesini kullanaca\u011f\u0131ndan dolay\u0131 s\u0131n\u0131f yap\u0131s\u0131ndaki property isimleri ile &#8220;appsettings.json&#8221; dosyas\u0131ndaki alan isimlerinin birebir ayn\u0131 olmas\u0131d\u0131r. Aksi taktirde e\u015fle\u015fme ba\u015far\u0131s\u0131z olaca\u011f\u0131ndan dolay\u0131 ilgili instance&#8217;da belirtilen alanlar null olarak gelecektir.<\/p>\n<p>Options pattern&#8217;i uygulayabilmek i\u00e7in uygulaman\u0131n &#8216;Startup.cs&#8217; dosyas\u0131ndaki &#8216;ConfigureServices&#8217; metodu i\u00e7erisinde a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fma yap\u0131lmal\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public Startup(IConfiguration configuration)\r\n        {\r\n            Configuration = configuration;\r\n        }\r\n\r\n        public IConfiguration Configuration { get; }\r\n\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.Configure&lt;Teacher&gt;(Configuration.GetSection(&quot;Teacher&quot;));\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;services&#8217; parametresi \u00fczerinden \u00e7a\u011fr\u0131lan &#8216;Configure&#8217; metodu ile &#8216;appsettings.json&#8217; dosyas\u0131ndaki &#8216;Teacher&#8217; alan\u0131 generic olarak belirtilen &#8216;Teacher&#8217; nesnesine d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek dependency injection provider\u0131na atanm\u0131\u015ft\u0131r. Bu i\u015flemden sonra ilgili veriler art\u0131k herhangi bir noktadan &#8216;IOptions&lt;T&gt;&#8217; t\u00fcr\u00fcnden istek yap\u0131larak ilgili nesne t\u00fcr\u00fcnde \u00e7a\u011fr\u0131labilecek vaziyettedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/03\/Asp.NET-Core-Options-Pattern.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/03\/Asp.NET-Core-Options-Pattern.jpg\" alt=\"Asp.NET Core - Options Pattern\" width=\"739\" height=\"183\" class=\"alignnone size-full wp-image-14189\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/03\/Asp.NET-Core-Options-Pattern.jpg 739w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/03\/Asp.NET-Core-Options-Pattern-300x74.jpg 300w\" sizes=\"auto, (max-width: 739px) 100vw, 739px\" \/><\/a><\/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, konfig\u00fcrasyonel ayarlar\u0131 uygulamaya h\u0131zl\u0131 bir \u015fekilde enjekte edebilmemiz i\u00e7in Options Pattern&#8217;i bizlere sunmaktad\u0131r. Bu desen sayesinde &#8220;appsettings.json&#8221; dosyas\u0131ndaki kay\u0131tlar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u015fekilde uygulamaya Dependency Injection ile dahil edebilmekte ve pratik bir&#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":14196,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2898,3103],"tags":[2679,3263,3262],"class_list":["post-14162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-3-0","category-asp-net-core-3-1","tag-asp-net-core","tag-asp-net-core-options-pattern","tag-options-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14162","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=14162"}],"version-history":[{"count":28,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14162\/revisions"}],"predecessor-version":[{"id":14197,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14162\/revisions\/14197"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/14196"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=14162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=14162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=14162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}