Dagger2: Qualifier ve Named Annotation

Bu yazıda Android’de dependency injection için kullandığımız Dagger2′ de yer alan @Qualifier ve @Named annotationlarından bahsedeceğim.

Neden @Named annotation ihtiyaç duyarız?

Dagger2’de kullanılmak istenen nesne @Provides annotation ile provide edilip sonrasında kullanılmak istenen yerde @Inject annotation ile inject ediliyor. Ancak @Provides annotation bir kısıtı var o da aynı tipe sahip nesneyi sadece bir kere provide edebilmesi. İşte bu probleme çözüm için @Named annotation kullanacağız. Örneğin;

üstteki gibi basit bir yapıda olan Car sınıfımız olsun ve type adında bir property alsın.

Biz bu sınıftan örneğin MainActivity içerisinde 2 tane nesneyi @Inject annotation kullanarak alalım.

CarModule.kt dosyasında da alttaki gibi provide ettiğimizi düşünün.

Compile ettiğinizde alttaki gibi bir hata ile karşı karşıya geleceksiniz.

Bu hatanın sebebi üstte bahsettiğim gibi @Provides annotation sadece tek bir nesneyi provide edebilmesi. Ama gördüğünüz üzere aynı sınıftan 2 farklı nesneye ihtiyacım var ve bunları provide edebiliyor olmam gerekiyor. Çözümü için @Named annotation kullanacağız.

CarModule.kt dosyasını alttaki gibi güncellersek;

Bu işlemden sonra MainActivity üzerinde inject ettiğimiz değerlere yine @Named ile hangisini istediğimizi söylüyoruz.

Artık Dagger bunların farklı 2 nesne olduğunu anlayacak ve inject işleminde herhangi bir hata ile karşılaşmayacaksınız.

İşin biraz daha derinine inelim ve @Named annotation kaynak kodlarına bakalım.

Burada dikkatinizi çekmek istediğim @Qualifier annotation.

Gördüğünüz üzere @Named annotation aslında bir qualifier. Yani aslında işin temelini @Qualifier annotation oluşturuyor.

@Qualifier javax.inject package altında geliyor ve istenilen nesneyi nitelemek(qualifiy) için kullanılıyor. Yani sizde @Qualifier sayesinde kendi custom annotation oluşturabilirsiniz.

Şimdi gelin kendi @Named annotationımızı yazalım ve adını da @CustomNamed yapalım.

Bunun için CustomNamed.kt adında bir dosya oluşturun ve alttaki kodları ekleyin.

Bundan sonra tek yapmanız gereken @Named annotationları @CustomNamed ile değiştirmek.

Siz de ihtiyacınıza göre kendi custom qualifier larınızı oluşturabilirsiniz.

https://dagger.dev/dev-guide/

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.