• Twitter
  • Instagram
  • slack-icon-black_edited_edited_edited
  • development_düzenlendi_düzenlendi
  • Gri LinkedIn Simge

© 2020 by mobiler.dev

  • EvrenAy

Dagger 2 vs Koin - Koin ile Dependency Injection

En son güncellendiği tarih: 19 Eyl 2019



What is KOIN?

Koin kendini şu şekilde tanımlıyor,

Koin is a DSL, a light container and a pragmatic API

Konuyu biraz açacak olursak, düşük yüke sahip, kullanımı kolay, modüler yapıda kullanılan bir bağımlılık api’siyiz diyorlar. Bakalım gerçekten öyle mi inceledikçe ve dagger2 ile karşılaştırdıkça göreceğiz :)

Başlamadan önce şunu söylemeliyim ki koin’in kendi dokümantasyonu da çok güzel yazılmış, daha detaylı bilgiler için aşağıdaki linkten inceleyebilirsiniz



Koin'de bağımlılık yönetiminin modüler bir şekilde gerçekleştiğini söylemiştim. Peki nasıl oluyor bu modüler bağımlılık yönetimi şimdi de biraz onu inceleyelim. Modülerliği sağlayan ve modülleri oluşturmamızı sağlayan bazı kavramlar var. Kısaca göz atalım.

factory {} : Bir instance fabrikası diyebiliriz, bu tanım bizim için her talep ettiğimizde yeni bir instance oluşturmak için görevlendirilmiştir .

single {} : Başlangıçta benzersiz, unique bir instance yaratılacağını ve daha sonraki her injection işleminde bu instance ın paylaşılacağını belirtir.(Bean adıyla da kullanılabilir.)

get() : İnstanceları çözmek için kullanılır. Yani koin, modüller içinde kullandığımız get() sayesinde bizim hangi class'a neyi enjekte ettiğimizi anlar.

module { } : Modülleri yada alt modülleri bu keyword içerisinde oluşturuyoruz.

Koini uygulama içerisinde ayağa kaldırmakta oldukça basit. Application classındaki oncreate metodunda startKoin { } keywordünün içine context ve modüllerimizin tutulduğu bir liste vermemiz yeterli.
startKoin(this, listOf(repositoryModule, networkModule, viewModelModule))

Bir örnekle bu zamana kadar öğrendiklerimizi pekiştirme vakti geldi. Koin'in kotlin ile nasıl kullanılabileceğiyle alakalı Arnaud Giuliani’nun basit bir kahve örneğine rastladım. Ben de konunun daha rahat anlaşılabilmesi için aynı örnekten yararlanıp elimden geldiğince açıklamaya çalışıcam.


Kütüphanemizi projemize dahil edelim

compile 'org.koin:koin-core:2.0.0-rc-2'

Proje Özeti

Projemizi kısaca özetleyecek olursak, bir kahve makinesinin işleyişini senaryo olarak alacağız.

Senaryomuz dahilinde bir ısıtıcımız, bir su pompamız bir de demleme mekanizmamız bulunuyor.

Isıtıcımızın aç, kapat ve sıcak su var mı yok mu kontrolü yapan fonksiyonları bulunuyor.

Su pompamızın eğer su sıcaksa demlemek için gerekli olan suyu pompalayan bir fonksiyonu bulunuyor.

Demleme mekanizmamızında demle adında bir fonksiyonu bulunmakta.

Şimdi bu işleyişi koin ile nasıl çalıştırırız kod üzerinde bakalım.



Time to CODE

İnterfaceli yapıyı anlatmaya girmeyeceğim önceki dependecy injection'ı anlattığım makalemde detaylı olarak neden interface kullanıldığını ve nasıl kullanıldığının anlatımını yapmıştım. Bahsettiğim senaryonun koda dökülmüş hali, herhangi farklı bir yer olmadığı için sıradaki yapımız olan pompaya geçelim.


Burada daha önce görmediğimiz bir olay var. Thermosiphon classımızın yapıcı metodunda bir ısıtıcı nesnesi alıyoruz ve metoduna erişiyoruz. Burada bir terslik yok. Enterasan olan nokta şu ki ben uygulama içinden hiç biryerden Thermosiphon classından bir nesne yaratıp yapıcı metoduna heater'ı göndermiyorum.İşte bu noktada koin devreye giriyor. Benim yerime bu bağımlılığı ve injection olayını yöneten koin oluyor. Benim yapmam gereken sadece koin'e şöyle bir yerde şöyle bir injection olayı var gereğini yap diyorum ve işim bitiyor.

Şu noktaya da ayrı bir satır açmak istiyorum. Koin ile injection işlemi 2 şekilde yapılabiliyor.

1- Yapıcı metot ile injection

2- by inject() son ekini kullanarak yapılan injection işlemide lazy injectler için kullanılır.(Activity, fragment, Service…)


Son olarak demle metodumuzla birlikte yine yapıcı metod ile yaptığımız inject işleminden gelen nesnelerimizi kullanarak demleme işlemini başlatıyoruz.

İşin püf noktasına geldik, demiştik ya koin'e neyi nasıl inject etmesini söylememiz gerekli diye şu an sıra oraya geldi.


Koin DSL keywordlerini kullanarak koine modüler bir şekilde nasıl instance oluşturacağını(single) ve çözmesi için instanceların nerede oluşturulduğunu ( get() ile ) bildirdik. CoffeMaker classımızın içindeki heater instance'ını lazy olarak oluşturmasını söyledik.


KoinComponent arayüzünü neden kullandık sorusunu duyar gibiyim :)

Bunun 2 nedeni var.

1- KoinComponent arayüzü sayesinde lazy inject işleminin kilidini açıp, bu işlemi yapabilir hale geliyoruz.

2- Uygulamamızda köprü görevi görebiliyor. Koin ile bağlı olan classlarımızı, olmayan classlarımızla bağlamak için KoinComponent arayüzünü kullanabiliyoruz.

Sonuç olarak startCoin ile koini uygulamamızı da ayağa kaldırıp maker ile de brew'ii tetikleyerek injectionların gerçekleşmesini sağlıyoruz. Kahvemiz hazır keyifli içimler :)

Buraya kadar hep saf kotlin ile yazılmış örnekler üzerinden koin'ii anlatmaya çalıştım. Umarım yararlı olmuştur. Biraz da android tarafında viewmodel ile kullanımına bakarsak bence koin tamam olacaktır.

Ayrıca şu an için sadece koin'in kullanımı üzerinde durmak istiyorum. Son olarak yazacağım makalede koin ile dagger 2 karşılaştırması yapıp projenize göre karar verme durumunu size bırakmak istiyorum.

Lets Go ANDROID With ViewModel

implementation 'org.koin:koin-android-viewmodel:2.0.0-beta-4'or androidximplementation 'org.koin:koin-androidx-viewmodel:2.0.0-beta-4'

Enjekte işlemi için kullanılan instance oluşturmak istediğimiz viewmodel classlarımızı da aynı diğer classlarımız gibi modüllerimizin içine eklememiz gerekli. Bunu da şu şekilde yapıyoruz.



Retrofit kütüphanesini kullanarak network işlemlerini gerçekleştireceğimiz instance'larımızı single bir şekilde oluşturuyoruz.





ViewModel modülümüzü tanımlarken bir get() çözümleyicisi kullanmıştık. Bunun sebebi görüldüğü gibi viewmodel'in yapıcı metodunda gerçekleştirdiğimiz enjekte işleminden kaynaklıdır.

Koda devam edecek olursak servisden dönen cevabımızın status değeri ok ise ise live datamızın içinde tuttuğumuz listeye servisten dönen haberleri atıyoruz.





newsList adıyla activity üzerinde lazy inject yaparak viewmodel'imizden bir instance oluşturuyoruz.

BaseActivity classımızda da kullanabilmemiz için super den önce yani base oncreate metodu çağırılmadan önce oluşan viewmodel instance'ını BaseActivity'deki ile eşliyoruz.Daha sonra view modelimizdeki servis ile iletişime geçen metodu çağırıp haberleri içine attığımız livedata'mıza observe oluyoruz. Servisten cevap gelip haberler live dataya atıldığı anda bu bölüm tetikleniyor ve gelen liste adaptöre gönderilerek haberlerin ekrana listelenmesi sağlanıyor.

Sırada tek bir adım kaldı. Koin'i ayağa kaldırmak.




Koin'i kullanmak işte bu kadar basit. Haberler uygulamasına erişip biraz daha incelemek isterseniz ->


github : https://github.com/evrenay/mvvm-koin-rx-databing-boilerplate


Bir nebze olsa koin'i anlatabildiysem ne mutlu bana. Bir sonraki yazımda dagger2 ile bu işlemleri nasıl yaparız'ı anlatmaya çalışacağımm. Bu yazı serisinin sonuncu olan "koin vs dagger 2" kendi fikir ve karşılaştırmaları mı içeriyor olacak. Bir dahaki yazıda dagger2 ile buluşmak dileğiyle sağlıcakla…


#dependencyinjection #android #koin #androidkoin #koinvsdagger2





278 görüntüleme