Koin হল Kotlin-এর জন্য একটি DI ফ্রেমওয়ার্ক যা কোড জেনারেশন, রিফ্লেকশন বা অ্যানোটেশন ছাড়াই কাজ করে। লাইব্রেরিটি মডিউল বর্ণনা করার জন্য DSL ব্যবহার করে এবং Android, Ktor এবং Multiplatform সমর্থন সহ একটি হালকা কন্টেইনারের মাধ্যমে নির্ভরতা ইনজেক্ট করে। অফিসিয়াল Koin ডকুমেন্টেশন অনুসারে, ফ্রেমওয়ার্কটি ন্যূনতম boilerplate সহ মডিউল, স্কোপ এবং Jetpack Compose-এর জন্য বিল্ট-ইন সমর্থন প্রদান করে।
মূল বিষয়
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 টাইপ সহ inline ফাংশনের উপর নির্মিত যা কম্পাইল সময়ে ফাংশন বডিতে কংক্রিট টাইপ প্রতিস্থাপন করে। এটি Koin-কে চূড়ান্ত APK আকারের দিক থেকে সবচেয়ে হালকা DI ফ্রেমওয়ার্কগুলির মধ্যে একটি করে তোলে: Koin যোগ করলে অ্যাপ্লিকেশনের আকার মাত্র 100-150 KB বৃদ্ধি পায়, যেখানে Dagger Hilt জেনারেটেড কোডের কারণে প্রায় 500 KB যোগ করে।
Koin কন্টেইনার startKoin ফাংশনের মাধ্যমে আরম্ভ করা হয়, যা কনফিগারেশন সহ একটি ল্যাম্বডা গ্রহণ করে। এই ল্যাম্বডার ভিতরে, রেজিস্ট্রেশন সহ মডিউল — DI লজিকের প্রধান বিল্ডিং ব্লক — বর্ণনা করা হয়।
startKoin ফাংশন একটি বিশ্বব্যাপী কন্টেইনার তৈরি করে যা GlobalContext-এর মাধ্যমে অ্যাপ্লিকেশনের যেকোনো স্থান থেকে অ্যাক্সেসযোগ্য, তবে মাল্টি-মডিউল প্রকল্পে বিচ্ছিন্ন কন্টেইনার তৈরি করতে KoinApplication ব্যবহার করার পরামর্শ দেওয়া হয়। Android-এ, আরম্ভের জন্য AndroidContext ব্যবহার করা হয়, যা স্বয়ংক্রিয়ভাবে Application জীবনচক্রের সাথে আবদ্ধ হয়। মডিউলগুলি modules প্যারামিটারের মাধ্যমে নিবন্ধিত হয়, যা Module ইনস্ট্যান্সের একটি তালিকা গ্রহণ করে।
val networkModule = module {
single {
OkHttpClient()
}
single {
Retrofit.Builder()
.baseUrl("https://api.example.com")
.build()
}
}
startKoin {
modules(networkModule)
}
প্রতিটি মডিউলে single (সিঙ্গলটন) বা factory (নতুন ইনস্ট্যান্স) এর মাধ্যমে সংজ্ঞা থাকে। সংজ্ঞাগুলি get()-এর মাধ্যমে অন্যান্য নিবন্ধিত নির্ভরতাগুলিকে উল্লেখ করতে পারে, যা স্পষ্ট টাইপ উল্লেখ এবং boilerplate কোড ছাড়াই একটি ইনজেকশন গ্রাফ গঠন করে।
Koin প্রসঙ্গ থেকে টাইপ অনুমানের জন্য reified প্যারামিটার সহ inline ফাংশন সক্রিয়ভাবে ব্যবহার করে। এটি ক্লাস স্পষ্টভাবে উল্লেখ না করে রেজিস্ট্রেশন লেখার অনুমতি দেয়: single { MyService() } ল্যাম্বডার রিটার্ন মান থেকে স্বয়ংক্রিয়ভাবে টাইপ নির্ধারণ করে।
Dagger-এর বিপরীতে, Koin কম্পাইল সময়ে নির্ভরতা গ্রাফ পরীক্ষা করে না — সমস্ত ত্রুটি অমীমাংসিত নির্ভরতায় প্রথম অ্যাক্সেসে রানটাইমে সনাক্ত করা হয়। এটি একটি আপস যা কোডকে উল্লেখযোগ্যভাবে সরল করে এবং বিল্ডকে গতি দেয়, তবে DI কনফিগারেশনের পরীক্ষা কভারেজ প্রয়োজন। অনেক দল কম্পাইল-টাইম চেকের অভাব সত্ত্বেও, উন্নয়নের গতি এবং সরলতার জন্য Koin বেছে নেয়।
Koin সংস্করণ 3.5-এ, Koin Annotations প্লাগইনের মাধ্যমে পরীক্ষামূলক কম্পাইল-টাইম গ্রাফ চেকিং উপস্থিত হয়েছে। ডেভেলপার @Module এবং @KoinComponent অ্যানোটেশন যোগ করে, এবং প্লাগইন যাচাইকরণ কোড তৈরি করে যা বিল্ডের সময় চলে। তবে, Koin-এর প্রধান সুবিধা — কোনো কোড জেনারেশন নেই — এই মোডে হারিয়ে যায়, তাই বেশিরভাগ দল পরীক্ষার মাধ্যমে রানটাইম চেক সহ ক্লাসিক DSL পদ্ধতি ব্যবহার করতে থাকে।
Koin নির্ভরতা ইনজেক্ট করার বেশ কয়েকটি উপায় প্রদান করে: by inject(), get() এবং সরাসরি কন্সট্রাক্টর পাসিং। পছন্দটি ব্যবহারের প্রসঙ্গের উপর নির্ভর করে।
by inject ডেলিগেট হল Android ViewModels এবং ফ্র্যাগমেন্টে সবচেয়ে সাধারণ ইনজেকশন পদ্ধতি। নির্ভরতা লেজিভাবে আরম্ভ হয় — শুধুমাত্র প্রথম প্রপার্টি অ্যাক্সেসে। এটি রিসোর্স-ভারী পরিষেবাগুলির জন্য কার্যকর যা অবিলম্বে প্রয়োজন নাও হতে পারে।
class MainViewModel : ViewModel() {
private val repository: UserRepository by inject()
fun loadUsers() {
repository.fetchAll()
}
}
get ফাংশন অবিলম্বে একটি নির্ভরতা ইনস্ট্যান্স ফেরত দেয়। এটি রেজিস্ট্রেশনের সময় ফ্যাক্টরি ল্যাম্বডার ভিতরে বা যখন নির্ভরতা লেজি আরম্ভ ছাড়াই সিঙ্ক্রোনাস প্রসঙ্গে প্রয়োজন হয় তখন ব্যবহৃত হয়। by inject()-এর বিপরীতে, get() লেজি লোডিং সমর্থন করে না এবং কলের সময় কন্টেইনারটি ইতিমধ্যে আরম্ভ হওয়া প্রয়োজন।
Koin-এ স্কোপ হল নির্ভরতা জীবনকালকে একটি নির্দিষ্ট কম্পোনেন্টের সাথে আবদ্ধ করার একটি প্রক্রিয়া, যেমন একটি Activity, Fragment বা কাস্টম সেশন। এটি Android অ্যাপ্লিকেশনে মেমরি ব্যবস্থাপনার জন্য মূল কার্যকারিতা।
মডিউলের ভিতরে scope ফাংশন একটি স্কোপ তৈরি করে যা আবদ্ধ কম্পোনেন্ট যতদিন বেঁচে থাকে ততদিন বেঁচে থাকে। স্কোপে নিবন্ধিত সমস্ত নির্ভরতা বন্ধ হলে ধ্বংস হয়ে যায়, যা মেমরি লিক প্রতিরোধ করে।
val userScope = module {
scope<UserSession> {
scoped {
UserRepository(get())
}
scoped {
SessionManager(get())
}
}
}
scoped ফাংশন একটি নির্ভরতা নিবন্ধন করে যা শুধুমাত্র স্কোপের ভিতরে বিদ্যমান থাকবে। স্কোপ বন্ধ হলে, সমস্ত scoped অবজেক্ট আবর্জনা সংগ্রহকারীর জন্য উপলব্ধ হয়ে যায়।
single লেজি আরম্ভ সহ পুরো অ্যাপ্লিকেশনের জন্য একটি একক ইনস্ট্যান্স নিবন্ধন করে। স্টেটলেস সার্ভিসের জন্য ব্যবহৃত হয়: নেটওয়ার্ক ক্লায়েন্ট, ক্যাশ, লগার।
factory প্রতিটি get() কলের সময় একটি নতুন ইনস্ট্যান্স তৈরি করে। এটি ViewModel, রিপোজিটরি এবং স্টেটফুল অবজেক্টের জন্য ব্যবহৃত হয় যেখানে প্রতিটি অ্যাক্সেসে একটি তাজা ইনস্ট্যান্স গুরুত্বপূর্ণ।
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
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 কোড জেনারেশন বা অ্যানোটেশন ছাড়াই রানটাইমে কাজ করে, যা বিল্ডকে গতি দেয় কিন্তু কম্পাইল সময়ে নির্ভরতা গ্রাফ পরীক্ষা করে না। Hilt কম্পাইল সময়ে কোড তৈরি করে এবং DI ত্রুটিগুলি আগে ধরে, তবে জটিল সেটআপ প্রয়োজন এবং বিল্ড ধীর করে।
হ্যাঁ, Koin সম্পূর্ণরূপে Kotlin Multiplatform সমর্থন করে। koin-core লাইব্রেরি সমস্ত Kotlin প্ল্যাটফর্মে কাজ করে, যখন koin-android এবং koin-compose যথাক্রমে Android এবং iOS-এর জন্য প্ল্যাটফর্ম-নির্দিষ্ট ক্ষমতা যোগ করে।
চক্রীয় নির্ভরতাগুলি রানটাইমে StackOverflowError-এর দিকে নিয়ে যায়। Koin সেগুলি স্বয়ংক্রিয়ভাবে সনাক্ত করে না। সমাধান হল আর্কিটেকচার রিফ্যাক্টরিং: একটি সাধারণ ইন্টারফেস বের করা, Listener/Observer প্যাটার্ন ব্যবহার করা, বা বিলম্বিত আরম্ভ সহ ফ্যাক্টরির মাধ্যমে চক্র ভাঙা।
Android-এ, স্কোপগুলি AndroidScope-এর মাধ্যমে Activity বা Fragment জীবনচক্রের সাথে আবদ্ধ করা যেতে পারে। কম্পোনেন্ট ধ্বংস হলে, Koin স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট স্কোপ বন্ধ করে দেয়। কাস্টম স্কোপে (ব্যবহারকারী সেশন), scope.close কল করে ম্যানুয়ালি বন্ধ করা হয়।
koin-test মডিউল থেকে koinTest ফাংশন ব্যবহার করুন। এটি পরীক্ষা মডিউল সহ একটি বিচ্ছিন্ন কন্টেইনার তৈরি করে যা পরীক্ষার পরে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়। বাস্তব নির্ভরতা Mockito বা MockK সহ একটি মডিউলের মাধ্যমে মক দিয়ে প্রতিস্থাপিত হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন