مقدمة في Koin: ما هو ولماذا تحتاجه
\n\nKoin هو إطار عمل خفيف وقوي وبديهي لحقن التبعيات (Dependency Injection, DI) في Kotlin. على عكس الحلول الثقيلة مثل Dagger أو Spring، لا يستخدم Koin الانعكاس (Reflection) أو التعليقات التوضيحية (Annotations) أو توليد الكود. كل شيء مبني على تركيبات DSL بسيطة (لغة خاصة بالمجال)، مما يجعل الكود نظيفًا وقابلًا للقراءة وسهل الاختبار.
\n\nلماذا تحتاج Koin؟ في تطوير التطبيقات المعقدة الحديثة، تعد إدارة التبعيات بين الفئات إحدى المهام الرئيسية. بدون DI، ستقوم بإنشاء الكائنات يدويًا، مما يؤدي إلى ترابط قوي في الكود، ويعقد الاختبار والصيانة. يحل Koin هذه المشكلات من خلال توفير طريقة بسيطة لتسجيل التبعيات وتكوينها والحصول عليها.
\n\nالمزايا الرئيسية لـ Koin:
\n- \n
- الخفة: تأثير ضئيل على حجم APK ووقت البناء. \n
- البساطة: لا يتطلب تعليقات توضيحية أو انعكاسًا أو توليد كود. \n
- أولوية Kotlin: يستخدم بالكامل إمكانيات اللغة (DSL، لامبدا، كوروتينات). \n
- النمطية: يسمح بتقسيم التبعيات إلى وحدات منطقية. \n
- قابلية الاختبار: سهولة استبدال التبعيات في الاختبارات. \n
- دعم Android: يحتوي على وحدات خاصة لنظام Android (ViewModel، Fragment، Compose). \n
تثبيت Koin
\n\nيتم توزيع Koin عبر Maven Central. للربط بالمشروع، أضف التبعيات إلى ملف build.gradle.kts (أو build.gradle).
لمشروع Kotlin Multiplatform / JVM:
\n// build.gradle.kts\ndependencies {\n // الوحدة الأساسية لـ Koin\n implementation("io.insert-koin:koin-core:3.5.6")\n \n // للاختبار\n testImplementation("io.insert-koin:koin-test:3.5.6")\n}\n\nلمشروع Android:
\n// build.gradle.kts (وحدة التطبيق)\ndependencies {\n // الوحدة الأساسية\n implementation("io.insert-koin:koin-android:3.5.6")\n \n // لـ ViewModel\n implementation("io.insert-koin:koin-androidx-viewmodel:3.5.6")\n \n // لـ Jetpack Compose\n implementation("io.insert-koin:koin-androidx-compose:3.5.6")\n \n // لـ WorkManager\n implementation("io.insert-koin:koin-androidx-workmanager:3.5.6")\n \n // للاختبار\n testImplementation("io.insert-koin:koin-test:3.5.6")\n testImplementation("io.insert-koin:koin-test-junit5:3.5.6")\n}\n\nهام: قد تتغير الإصدارات. يمكنك دائمًا التحقق من الإصدار الحالي على مستودع Koin على GitHub.
\n\nبداية سريعة مع Koin
\n\nلننظر إلى مثال بسيط: لدينا خدمة UserService تعتمد على UserRepository. بدلاً من إنشاء المستودع يدويًا، نستخدم Koin.
الخطوة 1: تعريف الفئات
\n// مستودع المستخدمين\nclass UserRepository {\n fun getUsers(): List<String> = listOf("Alice", "Bob", "Charlie")\n}\n\n// الخدمة التي تستخدم المستودع\nclass UserService(private val repository: UserRepository) {\n fun printUsers() {\n repository.getUsers().forEach { println(it) }\n }\n}\n\nالخطوة 2: إنشاء وحدة Koin
\n// الوحدة — هي حاوية نصف فيها كيفية إنشاء التبعيات\nval appModule = module {\n // single — سينشئ مثيلًا واحدًا للتطبيق بأكمله (مفرد)\n single<UserRepository> { UserRepository() }\n \n // factory — سينشئ مثيلًا جديدًا في كل طلب\n factory { UserService(get()) } // get() — يطلب التبعية UserRepository\n}\n\nالخطوة 3: تشغيل Koin
\n// في نقطة دخول التطبيق (main أو Application)\nfun main() {\n // تشغيل Koin