Dependency Injection bir software design pattern dir. Sadece AngularJS’ e özgü bir kavram olmadığı için başlı başına anlatmanın bir anlamı yok. Eğer Dependency Injection konusunda bir fikriniz yoksa, öncelikle internette kısa bir araştırma yapmanızı öneririm.Bu konumuzda, Dependency Injection‘ ın AngularJS’ te ne şekilde kullanılacağından bahsedeceğiz.

“Neden Dependency Injection ? “

https://docs.angularjs.org/guide/di#implicit-annotation#why-dependency-injection- adresinde çok güzel anlatılmış, öncelikle göz gezdirebilirsiniz. Lakin ne oluyor u daha iyi görmeniz açısından aşağıdaki resme bakmanızı rica ediyorum.

concepts-module-injector

Olayın en basit özeti şu;

Uygulamanız çalışırken pek çok bağımlılığı pek çok farklı yerde kullanacaksınız. Lakin bunların her ihtiyaç duyulduğunda yaratılması, eğer daha önceden yaratıldıysa var olanının kullanılmasının sağlanması ciddi bir iştir. İşte AngularJS’ in dependency injection özelliği bu işi yapmaktadır.

Resimde verilen örnekte herhangi bir dependency bir kere yaratılıyor ve cache’ e atılıyor. Her ihtiyaç duyulduğunda önce cache’ e bakılıyor. Cache’ te varsa oradan kullanılıyor. Yoksa sıfırdan yaratılıyor. Aksi halde uygulamanız performans açısından tahmin edilemez güçlüklerle pençeleşirdi.

 

AngularJS’ te başlıca 3 alanda Dependency Injection yapılmaktadır.

  • Service, Factory, Directive, Filter
  • Module
  • Controller

Inline Array Annotation Yöntemi ile

“Controller’ da Dependency Injection”

Hemen Örnekleyelim;

AngularJS Controllers on jsbin.com

Kodu incelediğimizde, aşağıdaki kısma dikkat ediyoruz.

$scope’ un ne olduğunu https://docs.angularjs.org/guide/scope adresindeki anlatımdan inceleyebiliriz. Bir bağımlılıktır. Uygulama genelindeki application model ile bağlantı kurar.

En basit açıklaması ile, controller da açacağınız her modeli yada metodu, $scope üzerinden açmanız gerekir.

Bu sebeple $scope bir dependency (bağımlılık) dir.

“Dependency leri sadece function içine yazıp, kullanabilirken Neden Annotation yapmamız tavsiye ediliyor ?”

Şimdiye kadar ki örneklerimizi incelediğimizde, dependency leri sadece function içine yazıp kullandık. Annotation yapmadık.

AngularJS Annotation nedir ?

Dependency lerin tanımlanma formatıdır. Normalde dependency ler sadece function içine yazılıp kullanılabilirken aşağıdaki şekilde, öncelikle köşeli parantez içinde yazılmasına Annotation denir.

Neden Annotation yapmalıyız ?

Çünkü https://docs.angularjs.org/guide/di#implicit-annotation adresinde ve http://angulartr.com/angularjs-ile-uygulama-gelistirirken-uyulmasi-gereken-prensipler/ adresinde daha fazla detaylarını öğrenebileceğiz gibi, eğerki kodunuzu minify yapmayı düşünüyorsanız, dependency lerinizi annotation yapmadığınız durumda, kodunuz PATLAR. Çalışmaz. Çünkü minify eden tool herşeyi minify edeceğinden, $scope gibi bir değeride a,b ve c gibi bir isimlendirmeye gidecektir. E tabi doğal olarak, AngularJS Framework’ ü çalışma sırasında bu değişkeni tanımayacak ve uygulamanız çalışmayacaktır.

“Factory, Service,Directive ve Filter’ da Dependency Injection”

Controller daki ile birebir aynıdır.

 

“Module de Dependency Injection”

Diğerlerinden farklı olarak, Module lerde bağımlılıkların 2 farklı hali, kendisi ve provider’ ı injection yapılır. Bunlarda modülün 2 farklı metodunda injection yapılır.

Modülün config metodunda, dependency nin provider’ ı yani instance edilmemiş hali injection yapılır.

Modülün run metodunda ise Dependency’ nin elde edilmiş instance’ ı injection yapılır.

Bunların farkını ilerleyen konularda çok daha iyi görecek ve anlayacaksınız.

 

Şimdiye kadar gördüğümüz tüm injection lar inline array annotation şeklinde yapılmıştı. Yani kodun içinde dizi açarak, içine dependency ler yazılıyordu. Şimdi daha farklı bir yöntem inceleyeceğiz.

“$inject Property Annotation ile Dependency Injection”

Nasıl mı ?, önce kodu verelim.

Gördüğünüz üzere, controller ı yazarken, inline array annotation yapmadım. Lakin daha sonradan MyController’ ın $inject property si üzerinden array halinde injection yaptım.

 

Benim tavsiyem inline array annotation’ ı kullanmanız.

2 Comments AngularJS Dependency Injection

  1. Emre

    Emeğine sağlık dostum güzel bir yazı olmuş. Takıldığım bir durum var yardımcı olur musun bilmem. Jhon Papa best practice leri üzerinden çalışıyordum ama bu injection olayı biraz bulanırdı ortalığı. Factory içinde oluşturduğum array bana controller içinde lazım ama ulaşamadım bir türlü nasıl yapabileceğim konusunda yardım edebilirsin umarım.

    Reply

Leave A Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir