در این مقاله آنچه از Dagger2 یاد گرفتیم رو به صورت خلاصه مرور میکنیم
مقاله اول - قسمت 1 : مقدمه
مقاله اول - قسمت 2 : ساختار اصلی
مقاله دوم : Scope & SubComponent
مقاله سوم : ViewModel
هر کلاسی وابستگی هایی داره که هدف ما از عمل DI یا Dependency Injection ، تزریق اونها به داخل کلاسه ، برای این کار در اندروید میشه از Dagger2 استفاده کرد
هر Component وابستگی های مورد نظر Class های که متعلق به اون Component هستند رو درش داره و این وابستگی ها توسط Module های اون Component تهیه میشه ، معمولا ما یک Component کلی به نام AppComponent خواهیم داشت و یک سری Component زیرمجموعه ، اگر برنامه مثلا n مرحله کلی داشته باشد (مثلا دو مرحله مثل لاگین و عادی) n عدد SubComponent برای این Component اصلی ساخته میشود
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector
abstract fun contributeAuthActivity() : AuthActivity
// AuthActivity is a client , we can inject sth to it
}
در کد بالا که یک Module متعلق به AppComponent است ، تعریف یک SubComponent آورده شده اما کجاست ؟ در کدهایی که Dagger پشت صحنه برای ما تولید میکند ، کافیه Activity مورد نظر رو از DaggerAppCompatActivity ارث ببریم تا Dagger کل کار رو هندل کنه ، همین روال رو برای Fragment ها هم میشه انجام داد و اونا رو تبدیل به یک SubComponent برای یک SubComponent کرد .
برای دسته بندی بهتر میتونیم از Scope استفاده کنیم ، یکی از مشهور ترین Scope ها @Singleton است که معمولا روی AppComponent نشسته میشه ، کار اون اینه که مشخص کنه AppComponent در تمامی مراحل اجرای برنامه پایدار بمونه و Instance هایی که برای ما Provide میشوند فقط یک بار تهیه بشن (تا اضافه کاری صورت نگیره) ، ما برای SubComponent هامون میتونیم Custom Scope ایجاد کنیم ، فایده اون هم مثل فایده @Singleton خواهد بود .
مسائلی مثل Api رو معمولا باید در AppComponent و از طریق Module مربوطه (که با مثلا میشه AppModule) ایجاد کرد و وابستگی های داخلی هر SubComponet رو توسط Module های داخلیش ، در یک Module به این صورت وابستگی رو ایجاد میکنیم :
@Module
class AppModule {
@Provides fun requestFolan() : Folan
{
return sth ;
}
}
وابستگی که برای ما Provide شده هم در خودِ Module (برای ایجاد وابستگی های دیگر) و هم در خود کد (مثلا Activity ها) قابل استفاده هستند ، در Module نیازی نیست کاری انجام بشه ، به راحتی میشه ورودی یک Provider رو از جنس وابستگی قبلی گذاشت تا خودِ Dagger کار رو انجام بده و در داخل کد هم از طریق @Inject میشه کار رو انجام داد.
@Inject
lateinit var folan;
مشکلی هم در مورد ViewModel و عدم سازگاری اون با Dagger2 وجود داره که برای حلش باید از کدِ مقاله Advance استفاده کنید .
دوستان سری مقاله های Dagger2 به اتمام رسیده و اگه سوالی داشتید در Comment ذکر کنید
با تشکری ، شبیری