﻿
{"id":17341,"date":"2020-08-11T21:30:36","date_gmt":"2020-08-11T21:30:36","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17341"},"modified":"2020-08-11T21:30:36","modified_gmt":"2020-08-11T21:30:36","slug":"azure-functions-serisi-11-dependency-injection","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/azure-functions-serisi-11-dependency-injection\/","title":{"rendered":"Azure Functions Serisi #11 &#8211; Dependency Injection"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/azure-functions-yazi-serisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Azure Functions yaz\u0131 serisi<\/a>nin bu onbirinci makalesinde, bir Azure Function \u00fczerinde <a href=\"https:\/\/www.gencayyildiz.com\/blog\/dependency-injection-nedir-nasil-uygulanir\/\" rel=\"noopener noreferrer\" target=\"_blank\">Dependency Injection<\/a> design pattern&#8217;\u0131n\u0131n nas\u0131l kullan\u0131labildi\u011fini inceleyece\u011fiz.<\/p>\n<h4 style=\"color: #e83e8c;\">Ba\u015flarken<\/h4>\n<p>Visual Studio edit\u00f6r\u00fc arac\u0131l\u0131\u011f\u0131yla bir Http Trigger t\u00fcr\u00fcnden Azure Function olu\u015fturunuz. Ard\u0131ndan Azure function \u00fczerinde dependency injection yapmam\u0131z\u0131 sa\u011flayacak olan <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Azure.Functions.Extensions\/\" rel=\"noopener noreferrer\" target=\"_blank\">Microsoft.Azure.Functions.Extensions<\/a> k\u00fct\u00fcphanesini ilgili projeye  y\u00fckleyiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection.jpg\" alt=\"Azure Functions Serisi #11 - Dependency Injection\" width=\"440\" height=\"130\" class=\"aligncenter size-full wp-image-17344\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection.jpg 440w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-300x89.jpg 300w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/a><\/p>\n<h4 style=\"color: #e83e8c;\">Kurulum&#038;Entegrasyon<\/h4>\n<p>Hat\u0131rlarsan\u0131z e\u011fer, klasik Asp.NET Core uygulamalar\u0131nda bir servisin entegrasyonu i\u00e7in &#8216;Startup.cs&#8217; dosyas\u0131 kullan\u0131lmaktad\u0131r. \u0130\u015fte Azure function uygulamalar\u0131nda da entegrasyon sorumlulu\u011funu \u00fcstlenecek olan ayn\u0131 mahiyette bir dosyaya ihtiyac\u0131m\u0131z vard\u0131r. Bunun i\u00e7in bir .cs uzant\u0131l\u0131 dosya ekleyerek ad\u0131na yine &#8216;Startup&#8217; diyebilir ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi in\u015fa edebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Microsoft.Azure.Functions.Extensions.DependencyInjection;\r\nusing Microsoft.Extensions.DependencyInjection;\r\n\r\n&#x5B;assembly: FunctionsStartup(typeof(ExampleFunction.Startup))]\r\nnamespace ExampleFunction\r\n{\r\n    public class Startup : FunctionsStartup\r\n    {\r\n        public override void Configure(IFunctionsHostBuilder builder)\r\n        {\r\n            builder.Services.AddSingleton&lt;IMyService, MyService&gt;();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, olu\u015fturulan &#8216;Startup&#8217; s\u0131n\u0131f\u0131n\u0131n &#8216;FunctionsStartup&#8217; abstract class&#8217;\u0131n\u0131 implement etmesi gerekmekte ve override neticesinde uygulanan &#8216;Configure&#8217; metodu i\u00e7erisinde dependency injection servisine ilgili enjeksiyonlar ger\u00e7ekle\u015ftirilmektedir. Ayriyetten &#8216;namespace&#8217;e odaklan\u0131rsan\u0131z e\u011fer &#8216;assembly&#8217; target&#8217;\u0131 e\u015fli\u011finde &#8216;FunctionsStartsup&#8217; attribute&#8217;u ile i\u015faretlenerek &#8216;Startup&#8217; s\u0131n\u0131f\u0131n\u0131n verilmesi ile namespace seviyesinde bir bildirimde bulunulmas\u0131 gerekmektedir.<\/p>\n<h4 style=\"color: #e83e8c;\">Dependency Injection Kullan\u0131m\u0131<\/h4>\n<p>Olu\u015fturulan &#8216;Startup&#8217; class&#8217;\u0131n\u0131n, namespace seviyesinde &#8216;FunctionsStartup&#8217; attribute&#8217;u ile i\u015faretlenerek bildirilmesi neticesinde art\u0131k ayn\u0131 namespace alt\u0131nda bulunan t\u00fcm functionlar i\u00e7in ilgili entegrasyonun sa\u011fland\u0131\u011f\u0131 anlam\u0131na gelmektedir. Haliyle bu a\u015famadan sonra herhangi bir function&#8217;da a\u015fa\u011f\u0131daki gibi bir dependency injection talebinde bulunabilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-1.jpg\" alt=\"Azure Functions Serisi #11 - Dependency Injection\" width=\"446\" height=\"322\" class=\"aligncenter size-full wp-image-17348\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-1.jpg 446w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-1-300x217.jpg 300w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/a><br \/>\nBurada dikkat edilirse e\u011fer constructor \u00fczerinden dependency injection neticesinde elde edilen servise eri\u015febilmek i\u00e7in hem class&#8217;\u0131n hem de function&#8217;\u0131n direkt olarak i\u015faretli geldi\u011fi static keyword\u00fcn\u00fcn kald\u0131r\u0131lmas\u0131 gerekmektedir.<\/p>\n<h4 style=\"color: #e83e8c;\">Function Seviyesinde Dependency Injection Ger\u00e7ekle\u015ftirme<\/h4>\n<p>Entekte edilmi\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 her daim constructor \u00fczerinden talep etmek istemeyebilirsiniz. Bazen fonksiyon \u00fczerinden de bu ihtiyac\u0131 gidermek daha efektif olabilecektir. Bunun i\u00e7in bir\u00e7ok yol\/yordam mevcuttur, lakin bu yollar\u0131n bir \u00e7o\u011fu anti-patern olarak de\u011ferlendirilmektedir. \u015eimdi konuyu g\u00fczel bir y\u00f6ntem olan Autofac k\u00fct\u00fcphanesiyle birlikte ele alal\u0131m.<\/p>\n<blockquote><p><em style=\"color:red;\">Asp.NET Core uygulamalar\u0131nda kulland\u0131\u011f\u0131m\u0131z &#8216;FromServices&#8217; attribute&#8217;u Azure Function&#8217;lar i\u00e7in ge\u00e7erli de\u011fildir&#8230;<\/em><\/p><\/blockquote>\n<p>Function seviyesinde dependency injection talebinde bulunabilmek i\u00e7in <a href=\"https:\/\/www.nuget.org\/packages\/AzureFunctions.Autofac\" rel=\"noopener noreferrer\" target=\"_blank\">AzureFunctions.Autofac<\/a> k\u00fct\u00fcphanesinden faydalanaca\u011f\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-2.jpg\" alt=\"Azure Functions Serisi #11 - Dependency Injection\" width=\"349\" height=\"120\" class=\"aligncenter size-full wp-image-17356\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-2.jpg 349w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-11-Dependency-Injection-2-300x103.jpg 300w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><\/a><\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki gibi bir yap\u0131land\u0131rma dosyas\u0131 eklemeniz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n      public class DIConfig\r\n    {\r\n        public DIConfig(string functionName)\r\n        {\r\n            DependencyInjection.Initialize(builder =&gt; builder.RegisterType&lt;MyService&gt;().As&lt;IMyService&gt;(), functionName);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gibi function seviyesinde ilgili servisi enjekte edebilir, talebinizi yapabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;DependencyInjectionConfig(typeof(DIConfig))]\r\n    static public class Function1\r\n    {\r\n        &#x5B;FunctionName(&quot;Function1&quot;)]\r\n        static public async Task&lt;IActionResult&gt; Run(\r\n            &#x5B;HttpTrigger(AuthorizationLevel.Function, &quot;get&quot;, &quot;post&quot;, Route = null)] HttpRequest req,\r\n            ILogger log, &#x5B;Inject] IMyService myService)\r\n        {\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Burada ilgili function&#8217;\u0131 &#8216;DependencyInjectionConfig&#8217; attribute&#8217;u ile i\u015faretleyerek yap\u0131land\u0131rma dosyas\u0131n\u0131 bildirmeniz ve ard\u0131ndan &#8216;Inject&#8217; attribute&#8217;u ile servisi talep etmeniz yeterli olacakt\u0131r.<\/p>\n<h4 style=\"color: #e83e8c;\">Options Pattern Kullan\u0131m\u0131<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-options-pattern\/\" rel=\"noopener noreferrer\" target=\"_blank\">Options pattern<\/a>, Asp.NET Core mimarisinde &#8216;appsettings.json&#8217; dosyas\u0131ndaki verileri yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u015fekilde nesnel olarak bizlere sunan bir tasar\u0131m desenidir. Benzer mant\u0131kla Azure function&#8217;da ise &#8216;local.settings.json&#8217; dosyas\u0131ndaki verileri yap\u0131land\u0131rmam\u0131z\u0131 sa\u011flamakta ve b\u00f6ylece s\u00fcrece efektiflik kazand\u0131rmaktad\u0131r.<\/p>\n<p>Tasar\u0131m\u0131n modellenmesi \u015fu \u015fekildedir;<br \/>\n&#8216;local.settings.json&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi veri tan\u0131mlan\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;IsEncrypted&quot;: false,\r\n  &quot;Values&quot;: {\r\n    &quot;AzureWebJobsStorage&quot;: &quot;UseDevelopmentStorage=true&quot;,\r\n    &quot;FUNCTIONS_WORKER_RUNTIME&quot;: &quot;dotnet&quot;,\r\n    &quot;Datas&quot;: {\r\n      &quot;MyData&quot;: &quot;Sende ba\u015f\u0131n\u0131 al\u0131p gitme ne olur...&quot;\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Ard\u0131ndan bu veriye kar\u015f\u0131l\u0131k entity olu\u015fturulur.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Datas\r\n    {\r\n        public string MyData { get; set; }\r\n    }\r\n<\/pre>\n<p>Ve &#8216;FunctionsStartup&#8217; abstract class&#8217;\u0131ndan t\u00fcreyen ve bizimde &#8216;Startup&#8217; ismini verdi\u011fimiz class i\u00e7erisinde a\u015fa\u011f\u0131daki gibi ilgili veriler options pattern ile service provider&#8217;\u0131na ilgili entity ile e\u015fle\u015ftirilerek dahil edilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup : FunctionsStartup\r\n    {\r\n        public override void Configure(IFunctionsHostBuilder builder)\r\n        {\r\n            builder.Services.AddSingleton&lt;IMyService, MyService&gt;();\r\n            builder.Services.AddOptions&lt;Datas&gt;()\r\n                .Configure&lt;IConfiguration&gt;((datas, configuration) =&gt;\r\n            {\r\n                configuration.GetSection(&quot;Datas&quot;).Bind(datas);\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada &#8216;Bind&#8217; operasyonunun i\u015flevine de\u011finirsek e\u011fer; &#8216;Bind&#8217;, verilen section i\u00e7erisindeki de\u011ferleri entity&#8217;de uygun property kar\u015f\u0131l\u0131klar\u0131na ba\u011flayan bir fonksiyondur.<\/p>\n<p>Nihai olarak ilgili data &#8216;IOptions&#8217; interface&#8217;i ile a\u015fa\u011f\u0131daki gibi dependency injection ile talep edilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Function1\r\n    {\r\n        readonly Datas _datas;\r\n        public Function1(IOptions&lt;Datas&gt; datas)\r\n        {\r\n            _datas = datas.Value;\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>\u0130\u015fte Azure Function \u00fczerinde bu \u015fekilde dependency injection ger\u00e7ekle\u015ftirilmektedir \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, Azure Functions yaz\u0131 serisinin bu onbirinci makalesinde, bir Azure Function \u00fczerinde Dependency Injection design pattern&#8217;\u0131n\u0131n nas\u0131l kullan\u0131labildi\u011fini inceleyece\u011fiz. Ba\u015flarken Visual Studio edit\u00f6r\u00fc arac\u0131l\u0131\u011f\u0131yla bir Http Trigger t\u00fcr\u00fcnden Azure Function olu\u015fturunuz. Ard\u0131ndan Azure function&#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":17011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3121],"tags":[3686,3729,3731,946,3730],"class_list":["post-17341","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","tag-azure-function","tag-azure-function-dependency-injection","tag-azurefunctions-autofac","tag-dependency-injection","tag-microsoft-azure-functions-extensions"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17341","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=17341"}],"version-history":[{"count":18,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17341\/revisions"}],"predecessor-version":[{"id":17362,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17341\/revisions\/17362"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/17011"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=17341"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17341"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}