Ali Shobeyri
Ali Shobeyri
خواندن ۳ دقیقه·۵ سال پیش

Dagger2 In Android - Summery

در این مقاله آنچه از Dagger2 یاد گرفتیم رو به صورت خلاصه مرور می‌کنیم

مقاله اول - قسمت 1 : مقدمه

مقاله اول - قسمت 2 : ساختار اصلی

مقاله دوم : Scope & SubComponent

مقاله سوم : ViewModel

هر کلاسی وابستگی هایی داره که هدف ما از عمل DI یا Dependency Injection ، تزریق اونها به داخل کلاسه ، برای این کار در اندروید میشه از Dagger2 استفاده کرد

معماری کلی Dagger2
معماری کلی 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 کرد .

هر Component یک سری SubComponent داره که هر کدام از این ها Module های خودشون رو دارند ، SubComponent به تمامی Module های Component والد خودش دسترسی داره
هر Component یک سری SubComponent داره که هر کدام از این ها Module های خودشون رو دارند ، SubComponent به تمامی Module های Component والد خودش دسترسی داره


برای دسته بندی بهتر می‌تونیم از 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 ذکر کنید

با تشکری ، شبیری

اندرویدبرنامه نویسیandroidتزریق وابستگی
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید