حقن الاعتماديات في KMP باستخدام Koin
اربط الوحدات المشتركة معًا باستخدام Koin في إعداد متعدد المنصات.
حقن الاعتماديات في KMP باستخدام Koin درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
لماذا نستخدم DI في KMP؟
يفصل Dependency Injection إنشاء المكونات عن استخدامها. وفي KMP، يُعد Koin إطار DI المفضل لأنه مكتوب بـKotlin خالصة ويعمل في commonMain من دون معالجات التعليقات التوضيحية.
// No annotation processing needed — Koin uses lambda DSL
// Add to build.gradle.kts:
// implementation("io.insert-koin:koin-core:3.5.0")
// androidMain: koin-android
// iosMain: no extra dep
fun main() { println("Koin works on all KMP targets") }DSL لوحدات Koin
عرّف الارتباطات داخل كتلة module { } باستخدام single أو factory أو scoped.
import org.koin.core.module.dsl.*
import org.koin.dsl.*
val appModule = module {
single { HttpClient() } // one instance
single<UserRepository> { RemoteUserRepository(get()) }
factory { GetUserUseCase(get()) } // new instance each time
}وحدة مشتركة في commonMain
عرّف وحدة Koin مشتركة في commonMain. وتوسّعها وحدات المنصة بارتباطات خاصة بالمنصة.
// commonMain/di/SharedModule.kt
import org.koin.dsl.module
fun sharedModule() = module {
single<UserRepository> { RemoteUserRepository(get()) }
single { GetUserUseCase(get()) }
single { UserViewModel(get()) }
}وحدة المنصة في androidMain
توفر وحدات المنصة محرك HTTP الفعلي، وبرنامج تشغيل قاعدة البيانات، وsingleton الخاصة بـAndroid.
// androidMain/di/AndroidModule.kt
import io.ktor.client.engine.okhttp.*
import org.koin.dsl.module
fun androidModule() = module {
single { OkHttp.create() } // Ktor engine
single { createHttpClient(get()) }
includes(sharedModule())
}startKoin في تطبيق Android
استدعِ startKoin { } داخل Application.onCreate في تطبيق Android. واستخدم androidContext(this) لإتاحة السياق.
// androidMain:
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
// In Application.onCreate():
startKoin {
androidContext(this@MyApp)
modules(androidModule())
}بدء Koin على iOS
على iOS، استدعِ KoinApplication.start() من Swift AppDelegate أو بنية App، مع تمرير وحدات Koin المشتركة.
// iosMain/KoinInit.kt:
import org.koin.core.context.startKoin
fun initKoin() {
startKoin {
modules(iosModule())
}
}
// Swift: KoinInitKt.doInitKoin() in AppDelegateحل التبعيات
في ViewModels أو حالات الاستخدام داخل commonMain، استخدم get() داخل وحدة، أو inject() / getKoin().get() في مواضع الاستدعاء.
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class UserViewModel : KoinComponent {
private val getUser: GetUserUseCase by inject()
fun load(id: String) = runBlocking { getUser(id) }
}نطاقات Koin لـViewModels
استخدم viewModel { } في وحدة Android مع ViewModels الخاصة بـAndroid، أو استخدم factory { } المحايد للمنصة مع ViewModels المشتركة.
// androidMain (with koin-android):
import org.koin.androidx.viewmodel.dsl.viewModel
val androidVmModule = module {
viewModel { UserViewModel(get()) }
}
// In Compose:
// val vm: UserViewModel = koinViewModel()الاختبار باستخدام Koin
استخدم startKoin في إعداد الاختبار مع وحدة اختبار تستبدل التبعيات الفعلية بتبعيات وهمية.
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
class UserViewModelTest {
@BeforeTest fun setup() {
startKoin { modules(module {
single<UserRepository> { FakeUserRepository() }
single { GetUserUseCase(get()) }
})}
}
@AfterTest fun teardown() = stopKoin()
}مقارنة single وFactory وScoped
single: نسخة واحدة طوال فترة تشغيل التطبيق. factory: نسخة جديدة عند كل استدعاء لـget(). scoped: نسخة واحدة لكل نطاق Koin، مثل نطاق الشاشة.
import org.koin.dsl.module
val lifetimeModule = module {
single { Database() } // shared, one instance
factory { Analytics() } // new on each get()
scope<ScreenScope> {
scoped { ScreenViewModel() } // one per screen lifecycle
}
}Koin مقابل DI اليدوي وHilt
Koin: متعدد المنصات، ولا يحتاج إلى KSP أو KAPT، ويطبق DI وقت التشغيل. Hilt: خاص بـAndroid، ويعمل وقت الترجمة، وتعتمد آليته على التعليقات التوضيحية. أما DI اليدوي فيوفر أقصى قدر من التحكم من دون تكلفة إطار عمل. وتستخدم مشاريع KMP Koin للمشاركة.
fun main() {
// Koin : commonMain, runtime, lambda DSL
// Hilt : androidMain only, compile-time
// Manual: no framework, explicit wiring in factory/module files
println("Choose Koin for KMP; Hilt for Android-only projects")
}الحقن الكسول باستخدام by inject()
يحل by inject() التبعية بشكل كسول عند أول وصول إليها، ولذلك يفيد في الفئات التي تطبق KoinComponent.
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class AppService : KoinComponent {
private val repo: UserRepository by inject() // resolved on first use
fun doWork() = println(repo.javaClass.simpleName)
}تحقق سريع
أي نطاق من نطاقات Koin ينشئ نسخة جديدة في كل مرة يُستدعى فيها get()؟
مراجعة
يستخدم Koin DSL قائمًا على lambdas من دون معالجة للتعليقات التوضيحية، مما يجعله مناسبًا لـKMP. عرّف الوحدات المشتركة في commonMain، ووحدات المنصة في source sets الخاصة بها. استخدم single للنسخ المفردة، وfactory للنسخ الجديدة، وby inject() للحل الكسول للتبعيات.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «حقن الاعتماديات في KMP باستخدام Koin» مجاني؟
نعم — نص درس «حقن الاعتماديات في KMP باستخدام Koin» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «حقن الاعتماديات في KMP باستخدام Koin»؟
اربط الوحدات المشتركة معًا باستخدام Koin في إعداد متعدد المنصات. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حقن الاعتماديات في KMP باستخدام Koin»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية مشروع KMP: commonMain وandroidMain وiosMain
- آلية expect/actual لواجهات برمجة المنصات
- مشاركة طبقتَي Repository وUse Case
- حقن الاعتماديات في KMP باستخدام Koin