Koin — یہ کیا ہے، Dependency Injection کے اصول اور یہ کیسے کام کرتا ہے

مصنف: IT Sectr اشاعت: 2026-05-04 مطالعے کا وقت: 8 منٹ

Koin Kotlin کے لیے ایک DI فریم ورک ہے جو کوڈ جنریشن، ریفلیکشن یا اینوٹیشن کے بغیر کام کرتا ہے۔ لائبریری ماڈیولز کو بیان کرنے کے لیے DSL استعمال کرتی ہے اور Android، Ktor اور Multiplatform کی حمایت کے ساتھ ہلکے کنٹینر کے ذریعے انحصار انجیکٹ کرتی ہے۔ سرکاری Koin دستاویزات کے مطابق، فریم ورک کم سے کم boilerplate کے ساتھ ماڈیولز، اسکوپس اور Jetpack Compose کے لیے بلٹ ان سپورٹ فراہم کرتا ہے۔

اہم نکات

  • Koin Kotlin کے لیے ایک DI فریم ورک ہے جو ریفلیکشن یا کوڈ جنریشن کے بغیر DSL استعمال کرتا ہے۔
  • ماڈیول single اور factory فنکشنز کے ذریعے انحصار رجسٹریشن کا منطقی گروپ ہے۔
  • single ایک سنگلٹن رجسٹر کرتا ہے جس کی مثال ایک بار بنتی ہے۔
  • factory ہر درخواست پر ایک نئی مثال بناتا ہے۔
  • Scope انحصار کی زندگی کو ایک جزو سے منسلک کرنے کا طریقہ کار ہے، جیسے Activity۔

Koin کیا ہے اور یہ کیسے مختلف ہے

Koin Kotlin کے لیے ایک DI فریم ورک ہے جو ریفلیکشن، اینوٹیشن یا کوڈ جنریشن کے بغیر خالص زبان میں لکھا گیا ہے۔ Dagger Hilt کے برعکس، جسے مرتب وقت پر اینوٹیشن پروسیسر اور کوڈ جنریشن کی ضرورت ہوتی ہے، Koin ماڈیولز کو بیان کرنے کے لیے ہلکے DSL کا استعمال کرتے ہوئے مکمل طور پر رن ٹائم پر کام کرتا ہے۔

Koin کا بنیادی خیال پیچیدہ انحصار گراف اور جزو درختوں کے تصورات کو سیکھنے کی ضرورت کے بغیر انحصار کو رجسٹر اور حل کرنے کے لیے ایک سادہ API فراہم کرنا ہے۔ ڈویلپر بیان کرتا ہے کہ کنٹینر کے لیے کون سی کلاسیں دستیاب ہیں، اور Koin انہیں کنسٹرکٹر یا by inject کے ذریعے سست ڈیلیگیٹس کے ذریعے خود بخود انجیکٹ کرتا ہے۔ فریم ورک Kotlin Multiplatform کے ساتھ مکمل طور پر مطابقت رکھتا ہے، جو Android، iOS اور سرور سائڈ پر یکساں DI طریقہ کار کی اجازت دیتا ہے۔

Kotlin Developers Community سروے (2025) کے مطابق، Koin 31% تجارتی Android پروجیکٹس میں استعمال ہوتا ہے، جو صرف Hilt (47%) کے بعد دوسرے نمبر پر ہے۔ اسے منتخب کرنے کی بنیادی وجہ سیٹ اپ میں آسانی اور کوڈ جنریشن کی ضرورت نہ ہونا ہے، جو پروجیکٹ کی تعمیر کو تیز کرتا ہے۔

درمیانے اور بڑے پروجیکٹس کے لیے Koin کا انتخاب کریں جہاں تیز ترقیاتی آغاز اہم ہو، یا Kotlin Multiplatform حل کے لیے جہاں Hilt آرکیٹیکچرل وجوہات کی بنا پر دستیاب نہ ہو۔

Koin ریفلیکشن یا کوڈ جنریشن استعمال نہیں کرتا — تمام رجسٹریشنز reified اقسام کے ساتھ ان لائن فنکشنز پر بنی ہیں جو مرتب وقت پر فنکشن باڈی میں ٹھوس قسم کو تبدیل کرتی ہیں۔ یہ Koin کو حتمی APK سائز کے لحاظ سے سب سے ہلکے DI فریم ورکس میں سے ایک بناتا ہے: Koin شامل کرنے سے ایپلیکیشن کا سائز صرف 100-150 KB بڑھتا ہے، جبکہ Dagger Hilt پیدا شدہ کوڈ کی وجہ سے تقریباً 500 KB کا اضافہ کرتا ہے۔

Koin کنٹینر اور DSL کیسے کام کرتے ہیں

Koin کنٹینر startKoin فنکشن کے ذریعے شروع کیا جاتا ہے، جو کنفیگریشن کے ساتھ ایک لیمبڈا قبول کرتا ہے۔ اس لیمبڈا کے اندر، رجسٹریشن والے ماڈیولز — DI منطق کا بنیادی بلڈنگ بلاک — بیان کیے جاتے ہیں۔

startKoin اور ماڈیولز

startKoin فنکشن ایک عالمی کنٹینر بناتا ہے جو GlobalContext کے ذریعے ایپلیکیشن میں کہیں سے بھی قابل رسائی ہے، تاہم ملٹی ماڈیول پروجیکٹس میں الگ تھلگ کنٹینر بنانے کے لیے KoinApplication استعمال کرنے کی سفارش کی جاتی ہے۔ Android میں، شروع کرنے کے لیے AndroidContext استعمال ہوتا ہے، جو خود بخود Application کی زندگی کے چکر سے منسلک ہو جاتا ہے۔ ماڈیولز modules پیرامیٹر کے ذریعے رجسٹر ہوتے ہیں، جو Module کی مثالوں کی فہرست قبول کرتا ہے۔

kotlin
val networkModule = module {
    single {
        OkHttpClient()
    }
    single {
        Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .build()
    }
}

startKoin {
    modules(networkModule)
}

ہر ماڈیول میں single (سنگلٹن) یا factory (نئی مثال) کے ذریعے تعریفیں ہوتی ہیں۔ تعریفیں get() کے ذریعے دیگر رجسٹرڈ انحصار کا حوالہ دے سکتی ہیں، جو واضح قسم کی وضاحت اور boilerplate کوڈ کے بغیر انجیکشن گراف بناتی ہیں۔

DSL اور ان لائن فنکشنز

Koin سیاق و سباق سے قسم کا اندازہ لگانے کے لیے reified پیرامیٹرز کے ساتھ ان لائن فنکشنز کو فعال طور پر استعمال کرتا ہے۔ یہ کلاس کو واضح طور پر بتائے بغیر رجسٹریشن لکھنے کی اجازت دیتا ہے: single { MyService() } لیمبڈا کی واپسی کی قدر سے خود بخود قسم کا تعین کرتا ہے۔

Dagger کے برعکس، Koin مرتب وقت پر انحصار گراف کی جانچ نہیں کرتا — تمام غلطیاں کسی حل نہ ہونے والے انحصار تک پہلی رسائی پر رن ٹائم پر دریافت ہوتی ہیں۔ یہ ایک سمجھوتہ ہے جو کوڈ کو نمایاں طور پر آسان بناتا ہے اور تعمیر کو تیز کرتا ہے، لیکن DI کنفیگریشن کے ٹیسٹ کوریج کی ضرورت ہوتی ہے۔ بہت سی ٹیمیں مرتب وقتی جانچوں کی کمی کے باوجود، ترقی کی رفتار اور سادگی کے لیے Koin کا انتخاب کرتی ہیں۔

Koin ورژن 3.5 میں، Koin Annotations پلگ ان کے ذریعے تجرباتی مرتب وقتی گراف جانچ ظاہر ہوئی۔ ڈویلپر @Module اور @KoinComponent اینوٹیشنز شامل کرتا ہے، اور پلگ ان توثیقی کوڈ تیار کرتا ہے جو تعمیر کے دوران چلتا ہے۔ تاہم، Koin کا بنیادی فائدہ — کوئی کوڈ جنریشن نہیں — اس موڈ میں کھو جاتا ہے، لہذا زیادہ تر ٹیمیں ٹیسٹ کے ذریعے رن ٹائم جانچ کے ساتھ کلاسک DSL طریقہ کار استعمال کرتی رہتی ہیں۔

Koin میں انحصار انجیکشن کے طریقے

Koin انحصار انجیکٹ کرنے کے کئی طریقے فراہم کرتا ہے: by inject()، get() اور براہ راست کنسٹرکٹر پاسنگ۔ انتخاب استعمال کے سیاق و سباق پر منحصر ہے۔

by inject() — سست انجیکشن

by inject ڈیلیگیٹ Android ViewModel اور فریگمنٹ میں انجیکشن کا سب سے عام طریقہ ہے۔ انحصار سستی سے شروع ہوتا ہے — صرف پہلی پراپرٹی تک رسائی پر۔ یہ وسائل والی خدمات کے لیے موثر ہے جن کی فوری ضرورت نہیں ہو سکتی۔

kotlin
class MainViewModel : ViewModel() {
    private val repository: UserRepository by inject()

    fun loadUsers() {
        repository.fetchAll()
    }
}

get() — واضح حصول

get فنکشن فوری طور پر انحصار کی مثال واپس کرتا ہے۔ یہ رجسٹریشن کے دوران فیکٹری لیمبڈا کے اندر یا جب انحصار سست آغاز کے بغیر مطابقت پذیر سیاق و سباق میں ضروری ہو استعمال ہوتا ہے۔ by inject() کے برعکس، get() سست لوڈنگ کی حمایت نہیں کرتا اور کال کے وقت کنٹینر کے پہلے سے شروع ہونے کی ضرورت ہوتی ہے۔

Koin میں ماڈیولز اور اسکوپس

Koin میں اسکوپ انحصار کی زندگی کو ایک مخصوص جزو سے منسلک کرنے کا طریقہ کار ہے، جیسے Activity، Fragment یا حسب ضرورت سیشن۔ یہ Android ایپلیکیشنز میں میموری کے انتظام کے لیے کلیدی فعالیت ہے۔

scope — ایک جزو سے منسلک کرنا

ماڈیول کے اندر scope فنکشن ایک اسکوپ بناتا ہے جو اس وقت تک زندہ رہتا ہے جب تک منسلک جزو زندہ ہے۔ اسکوپ میں رجسٹرڈ تمام انحصار بند ہونے پر ختم ہو جاتے ہیں، جو میموری لیکیج کو روکتا ہے۔

kotlin
val userScope = module {
    scope<UserSession> {
        scoped {
            UserRepository(get())
        }
        scoped {
            SessionManager(get())
        }
    }
}

scoped فنکشن ایک انحصار رجسٹر کرتا ہے جو صرف اسکوپ کے اندر موجود رہے گا۔ جب اسکوپ بند ہوتا ہے، تمام scoped اشیاء کوڑا کرکٹ جمع کرنے والے کے لیے دستیاب ہو جاتی ہیں۔

single بمقابلہ factory

single سست آغاز کے ساتھ پوری ایپلیکیشن کے لیے ایک ہی مثال رجسٹر کرتا ہے۔ بغیر حالت والی خدمات کے لیے استعمال ہوتا ہے: نیٹ ورک کلائنٹ، کیشے، لاگر۔

factory ہر get() کال پر ایک نئی مثال بناتا ہے۔ ViewModel، ریپوزٹریز اور حالت والی اشیاء کے لیے استعمال ہوتا ہے جہاں ہر رسائی پر نئی مثال اہم ہو۔

Android پروجیکٹس میں Koin

Koin کو Android پروجیکٹ میں ضم کرنا کم سے کم ہے: صرف build.gradle میں انحصار شامل کریں اور Application.onCreate میں startKoin کال کریں۔ Koin Jetpack Compose، Navigation اور WorkManager کے ساتھ انضمام کے لیے ماڈیولز فراہم کرتا ہے، جو اسے Hilt کا مکمل متبادل بناتا ہے۔

خصوصی koin-android-compose لائبریری koinViewModel() اور koinInject() کے ذریعے براہ راست Composable فنکشنز میں انحصار انجیکٹ کرنے کی اجازت دیتی ہے۔ یہ ہر اسکرین کے پیرامیٹرز کے ذریعے کنٹینر پاس کرنے کی ضرورت کو ختم کرتا ہے اور خودکار زندگی کے چکر کے تعلق سے ViewModel کوڈ کو صاف ستھرا بناتا ہے۔

Google I/O 2024 کے مطابق، Jetpack Compose نئے Android پروجیکٹس کے لیے بنیادی فریم ورک بن گیا ہے۔ Koin اضافی ترتیب کے بغیر Compose کے لیے مقامی معاونت فراہم کرتا ہے، coroutine سیاق و سباق کو مدنظر رکھتے ہوئے koinViewModel() کے ذریعے خود بخود اسکوپس کو ViewModel کی زندگی کے چکر سے منسلک کرتا ہے۔

جانچ کے لیے، Koin koinTest اور koinTestRule فنکشنز فراہم کرتا ہے، جو ٹیسٹ ماڈیولز کے ساتھ ایک الگ تھلگ ٹیسٹ کنٹینر بناتے ہیں اور ٹیسٹ مکمل ہونے کے بعد خود بخود بند کر دیتے ہیں۔ یہ ٹیسٹ کی علیحدگی کو یقینی بناتا ہے اور ٹیسٹ کیسز کے درمیان حالت کے اخراج کو روکتا ہے۔

Jetpack Navigation کے ساتھ Koin کا انضمام koin-androidx-navigation ماڈیول کے ذریعے لاگو کیا جاتا ہے۔ ہر اسکرین کا ViewModel اسکرین گھومنے پر حالت کو محفوظ رکھنے اور ایپلیکیشن معطل ہونے کے بعد بحالی کے لیے SavedStateHandle پاس کرنے کے ساتھ by viewModel() کے ذریعے خود بخود انحصار وصول کرتا ہے۔

Koin کے ساتھ ViewModel کے یونٹ ٹیسٹ کے لیے، koin-test-junit5 یا koin-test-junit4 لائبریری سے koinTestRule استعمال ہوتا ہے۔ قاعدہ ہر ٹیسٹ سے پہلے ٹیسٹ ماڈیولز کے ساتھ ایک الگ تھلگ کنٹینر بناتا ہے اور مکمل ہونے کے بعد خود بخود بند کر دیتا ہے، ٹیسٹ کیسز کے درمیان حالت کے اخراج کو روکتا ہے۔ حقیقی انحصار MockK کے ذریعے موک سے تبدیل کیے جاتے ہیں: single { mockk() } رجسٹریشن والا ماڈیول مرکزی ماڈیول کو اوور رائڈ کرتا ہے، اور ٹیسٹ میں ViewModel کو پیش قیاسی انحصار رویہ ملتا ہے۔

Koin 3.x کی اہم خصوصیات میں سے ایک Kotlin میں سرور ایپلیکیشنز بنانے کے لیے Ktor اور ڈیسک ٹاپ ایپلیکیشنز کے لیے Compose Multiplatform کی حمایت ہے۔ یہ Koin کو انجیکشن پیراڈائم کو تبدیل کیے بغیر تینوں Kotlin پلیٹ فارمز کا احاطہ کرنے والا واحد DI فریم ورک بناتا ہے۔ koin-ktor ماڈیول Application بلاک میں install(Koin) کے ذریعے انحصار رجسٹر کرنے اور Android کی طرح by inject() کے ذریعے راوٹس میں خدمات انجیکٹ کرنے کی اجازت دیتا ہے۔ یہ Koin کو کسی بھی آرکیٹیکچر کے Kotlin پروجیکٹس کے لیے ایک عالمی DI حل بناتا ہے — موبائل کلائنٹ سے سرور بیک اینڈ تک۔

koin-androidx-navigation ماڈیول کے ذریعے Jetpack Navigation کے ساتھ Koin کا انضمام ہر اسکرین کے لیے دستی طور پر ViewModelProvider.Factory بنانے کی ضرورت کو ختم کرتا ہے۔ ملٹی ماڈیول پروجیکٹس کے لیے، Koin loadKoinModules کے ذریعے سست ماڈیول لوڈنگ کو سپورٹ کرتا ہے، جس سے ہر فیچر ماڈیول اپنی DI کنفیگریشن کو آزادانہ طور پر منسلک کر سکتا ہے۔

اکثر پوچھے گئے سوالات

Koin Dagger Hilt سے کیسے مختلف ہے؟

Koin کوڈ جنریشن یا اینوٹیشن کے بغیر رن ٹائم پر کام کرتا ہے، جو تعمیر کو تیز کرتا ہے لیکن مرتب وقت پر انحصار گراف کی جانچ نہیں کرتا۔ Hilt مرتب وقت پر کوڈ تیار کرتا ہے اور DI کی غلطیوں کو پہلے پکڑتا ہے، لیکن پیچیدہ ترتیب کی ضرورت ہوتی ہے اور تعمیر کو سست کرتا ہے۔

کیا Koin Kotlin Multiplatform کو سپورٹ کرتا ہے؟

ہاں، Koin Kotlin Multiplatform کو مکمل طور پر سپورٹ کرتا ہے۔ koin-core لائبریری تمام Kotlin پلیٹ فارمز پر کام کرتی ہے، جبکہ koin-android اور koin-compose بالترتیب Android اور iOS کے لیے پلیٹ فارم مخصوص صلاحیتیں شامل کرتی ہیں۔

Koin میں چکری انحصار کو کیسے ہینڈل کریں؟

چکری انحصار رن ٹائم پر StackOverflowError کا باعث بنتے ہیں۔ Koin انہیں خود بخود دریافت نہیں کرتا۔ حل آرکیٹیکچر کی تنظیم نو ہے: مشترکہ انٹرفیس نکالنا، Listener/Observer پیٹرن استعمال کرنا، یا تاخیری آغاز کے ساتھ فیکٹری کے ذریعے چکر توڑنا۔

کیا مجھے اسکوپس کو دستی طور پر بند کرنے کی ضرورت ہے؟

Android میں، اسکوپس کو AndroidScope کے ذریعے Activity یا Fragment کی زندگی کے چکر سے منسلک کیا جا سکتا ہے۔ جب جزو ختم ہوتا ہے، Koin خود بخود متعلقہ اسکوپ کو بند کر دیتا ہے۔ حسب ضرورت اسکوپس (صارف سیشن) میں، scope.close کال کرکے دستی طور پر بند کیا جاتا ہے۔

Koin کے ساتھ کوڈ کیسے ٹیسٹ کریں؟

koin-test ماڈیول سے koinTest فنکشن استعمال کریں۔ یہ ٹیسٹ ماڈیولز کے ساتھ ایک الگ تھلگ کنٹینر بناتا ہے جو ٹیسٹ کے بعد خود بخود بند ہو جاتا ہے۔ حقیقی انحصار Mockito یا MockK کے ساتھ ماڈیول کے ذریعے موک سے تبدیل کیے جاتے ہیں۔

خلاصہ

  • Koin ریفلیکشن، اینوٹیشن یا کوڈ جنریشن کے بغیر DSL کے ساتھ Kotlin کے لیے ایک DI فریم ورک ہے۔
  • ماڈیولز single (سنگلٹن) اور factory (نئی مثال) کے ذریعے رجسٹریشن کو گروپ کرتے ہیں۔
  • startKoin by inject() اور get() کے ذریعے قابل رسائی ایک عالمی کنٹینر شروع کرتا ہے۔
  • اسکوپ انحصار کی زندگی کو Android جزو کی زندگی کے چکر سے منسلک کرتا ہے۔
  • Compose میں انجیکشن koinViewModel() اور koinInject() کے ذریعے کیا جاتا ہے۔
  • Koin Kotlin Multiplatform کو سپورٹ کرتا ہے، تمام پلیٹ فارمز پر یکساں DI طریقہ کار کی اجازت دیتا ہے۔
  • DI کی غلطیاں رن ٹائم پر دریافت ہوتی ہیں، لہذا کنفیگریشن کا ٹیسٹ کوریج لازمی ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں