Azure Functions Dependency Injection (DI) kullanımı

Ufuk Aytaş
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readJan 8, 2021

Serverless serisinin bu bölümünde DI tasarım modelinin Azure Function’da nasıl implemente edileceğini aşağıdaki başlıklarla inceleyeceğiz.

  • Dependency Injection (DI) nedir?
  • Neden Dependency Injection Kullanmalıyız?
  • Servis Yaşam Süreleri (Service Lifetime)
  • Azure Functions ile DI kullanımı

Dependency Injection (DI) nedir?

Bu tasarım desenine göre birbirine sıkı sıkıya bağlı olan bileşenlerin yerine “Loosely Coupled” gevlek bağlı bir şekilde yapılar oluşturulmasıdır. Bu sayede bağımlılıkların azaltılması, sürdürülebilir, gelişime açık, daha esnek, okunabilir ve test edilebilir bir yapının oluşturulması sağlanır.

Source: dzone.com

“Dependency Injection: Bağımlılıkların dışarıdan enjekte edilmesidir”

Neden Dependency Injection Kullanmalıyız?

  • Gevşek Bağlılık (Loosely coupled): Bağımlılık oluşturacak parçalarının ayrılıp, dışarıdan enjekte edilmesidir. Bu sayede esnek uygulamar geliştirebiliriz.
  • Yeniden Kullanılabilirlik ( Reusable) : Bağımlılıkların azaltılarak kod tekrarından kurtulmak yeniden kullanılabilir yapılar oluşturmamızı olanak sağlar.
  • Okunabilir Kod (Readable Code) : Projelerimizde bağımlılık artıkça kod tekrarları olur. Dependency Injection ile bağımlılıkları oluşturan parçaların ayrılması kodlarımız daha okunaklı bir hale getirir.
  • Yaşam süresi (Lifetime) : Builder nesnesinin hizmet nesnesine atadığı yaşam süresidir.

Yaşam sürelerinden kısaca bahsedecek olursak;

Servis Yaşam Süreleri (Service Lifetime)

  1. Transient: Her bir servis çağrısı yeni bir instance oluşturur.
  2. Scoped: Her bir request için tek bir instance yaratılmasını sağlar. Request döngüsü tamamlanana kadar oluşturulan instance gönderilir.
  3. Singleton: İlk request ile birlikte tek bir instance oluşturulur. Bundan sonraki her istek için aynı instance kullanılır.

Azure Functions ile DI kullanımı

Azure Function küçük kod parçalarını kolayca çalıştırmamızı sağlayan, uygulama geliştirmeyi hızlandırmak ve kolaylaştırmak için oluşturulmuş bir yapıdır.

Azure Functions hakkında detaylı bilgi için “Azure Functions Nedir” yazısını inceleyebilirsiniz.

Yeni bir Azure Function oluşturduğumuzda standart olarak static sınıf ve static method ile oluşmaktadır. Aslında oluşturduğumuz fonksiyon bizi en yalın hali ile karşılar.

Uygulamarımızı SOLID tasarım desenlerine ve mimarilere göre geliştirmek ve birbirine sıkı sıkıya bağlı uygulamalar yerine test edilebilir, soyutlanmış uygulamalar yazmak isteyebiliriz. Peki proje geliştirirken belirli tasarım kalıplarında, test edilebilir ve farklı mimarilerde geliştirme yapmak istersek ne yapacağız?

Şimdi örnek bir Azure Functions projesi ile nasıl DI oluşturulduğunu inceleyelim.

Projenin Oluşturulması

Projeyi Visual Studio 2019 kullanarak oluşturacağız.

Visual Studio 2019'u açıp Add a New Project diyerek yeni bir Azure Function projesi seçiyoruz.

Gerekli bilgileri girdikten sonra “Create” diyoruz. Bir sonraki adımda “HttpTrigger”’ı seçiyoruz, Storage Account olarak “Storage Emulator” ve Authorization level için “Function” seçip devam ediyoruz.

Fonksiyonların çalışabilmesi için bir Storage Account’a ihtiyaç duyar. Azure’da hesabınız olmasa bile “Storage Emulator” ile fonksiyonlarınızı local’de çalıştırabilirsiniz.

HttpTrigger template’i seçerek yeni bir fonksiyon oluşturduğumuzda bizi static bir sınıf ve static bir method karşılayacak.

NOT : Örnek için oluşturduğum Function1.cs dosyasını projeden siliyorum. İlerleyen adımlarda yeni bir fonksiyon ekleyeceğim.

Servislerimizi register edebilmemiz için Asp.Net Core’da olduğu gibi bir Startup dosyası oluşturmamız gerekiyor. Bunu sağlayabilmek için Azure Function projemize öncelikle “Microsoft.Azure.Functions.Extensions” paketini Nuget Package Manager ile yüklemeliyiz.

Install-Package Microsoft.Azure.Functions.Extensions -Version 1.1.0

Oluşturduğumuz “Startup” sınıfına istediğimiz ismi verebiliriz.

.NET Core uygulamaları ile aynı mantıkta olması için bu dosyayı Startup.cs dosyası olarak oluşturuyorum. Bu Startup dosyasını “FunctionsStartup” abstract sınıfından implemente ediyoruz. Override ettiğimiz “Configure” methodu ile artık DI yapmak istediğimiz servisleri tanımlayabiliriz.

Startup sınıfın başlangıç sınıfı olduğunu Azure Functions’a bildirmek için “FunctionsStartsup” attiribute’ünün namespace’e tanımlamamız gerekiyor.

[assembly: FunctionsStartup(typeof(Startup))]

Startup dosyamızı alttaki gibi oluşturduk.

Bu örnekte “IProductRepository” isminde bir interface oluşturacağım.

ProductRepository” sınıfını bu interface’den türeteceğiz.

Artık bağımlılıklarımızı IOC container’ına kaydedebiliriz. Startup dosyamıza DI tanımını ekliyoruz.

Functions isminde bir klasör oluşturarak üzerinde Sağ tıklayıp “Add a New Function” diyelim ve “GetAllProducts” isminde HttpTrigger’dan tetiklenen yeni bir fonksiyon oluşturalım. Fonksiyonumuz tekrar static keyword’ü ile oluşacaktır. İlk iş olarak bunu silmeyi sakın unutmayın.

Şimdi DI tanımımızı HTTP Trigger fonksiyonumuza ekleyebiliriz. Fonksiyonumuzun son hali aşağıdaki gibi olacaktır.

Şimdi Test Zamanı.

Uygulamamızı çalıştıralım ve Postman ile bir istek atalım.

Postman ile Get isteğinde bulunuyoruz ve Console’da işlemlerin başarılı olarak tamamlandığını görüyoruz.

Get request’imizin sonucunda beklediğimiz gibi response’da ürün listesini başarılı bir şekilde çektik.

Azure Functions projemizde DI kullanarak tamamlamış olduk.

Projeyi Github repo‘dan inceleyebilirsiniz.

Sonuç

Bu yazıda Dependency Injection’ın tanımını ve bir Azure Functions projesinde nasıl kullanabileceğimizi inceledik. Asp.Net Core uygulamalarında olduğu gibi Azure Function’da benzer şekilde Dependency Injection uygulanmaktadır. Ayrıca Autofac gibi 3th party uygulamalarlada DI uygulayabilirsiniz.

Bir sonraki makalede görüşmek üzere…

Sorularınız için lütfen yorum yapmaktan ve bana ulaşmaktan çekinmeyin.

Twitter: https://twitter.com/ufukaytas
Linkedin: https://www.linkedin.com/in/ufukaytass/
Github: https://github.com/ufukaytas/

--

--

Ufuk Aytaş
Devops Türkiye☁️ 🐧 🐳 ☸️

Software Architect & Developer @CorendonDutchAirlines, Husband, Dad, Fishing, Coffee addict :) #Serverless #Cloud, #Azure, #Dotnet