فاطمه ملکی
فاطمه ملکی
خواندن ۴ دقیقه·۴ سال پیش

دگر آسونه قسمت 2 (Module , @provides@)

خب تا اینجا با سه مدل اینجکت آشنا شدیم اما External Library , Interface , Lifecycle ها میتونن قضیه رو پیچیده کنن فرض کنیم که ماشین ما برای تولید شدن به غیر از Engine به یه کلاس دیگه هم وابسته باشه که این کلاس هم خودش به کلاس دیگه ای وابسته هست و کل این مجموعه توی یه اکسترنال لایبرری هست که ما اصلا دسترسی بهشون نداریم که بخوام inject رو اضافه کنیم.یه کلاس wheels ایجاد میکنیم که این کلاس car بهش وابسته هست و خود این کلاس هم به کلاس Tire وابسته هست فرض رو بر این میگیریم که به این دو تا کلاس دسترسی نداریم و از inject نمیتونیم استفاده کنیم.این کلاس Wheels :

public class Wheels { public static final String TAG=&quotWheels&quot Tire tire; public Wheels(Tire tire) { this.tire = tire; Log.d(TAG, &quotWheels Created&quot); }}

این کلاس Tire:

public class Tire { public static final String TAG =&quotTire&quot public Tire() { Log.d(TAG, &quotTire Created&quot); } public void inflate() { Log.d(TAG, &quotTire inflated&quot); }}

این هم تغییراتی هست که داخل car دادیم

public class Car { private static final String TAG = &quotCar&quot @Inject Engine engine; Wheels wheels; @Inject public Car(Wheels wheels) { this.wheels = wheels; Log.d(TAG, &quotcar created&quot); } @Inject public void drive() { Log.d(TAG, &quotdriving&quot); }}

چون دسترسی به اکسترنال لایبرری ها نداریم پس برای تامین وابستگی ها راه حل این هست که از module استفاده کنیم پس یه کلاس دیگه میسازیم به نام WheelsModule و بالا سرش انوتیشن module رو قرار میدیم این انوتیشن به دگر میگه که برای پیدا کردن و تامین وابستگی هات به Wheels باید از این بخش استفاده کنی خب ما برای اینکه وابستگی به wheels رو برطرف کنیم وابسته به کلاس Tire هم هستیم پس توی این کلاس ماژول به متدی نیاز داریم که خروجی از نوع Tire داشته باشه و انوتیشن provide بالاسرش بذاریم همینکار رو برای wheels هم انجام میدیم و در ورودی متد Tire رو پاس میدیم کلا هروقت که ما میخوایم به چیزی خارج از کلاسهای خودمون و در لایبرری های خارجی دسترسی داشته باشیم از دوتا انوتیشن خارجی استفاده میکنیم که یکی از اونها provide هست و دیگری bind.

اینم نحوه پیاده سازی کلاس ماژول ما هست:

@Module public class WheelsModule { @Provides Tire provideTire() { Tire tire = new Tire(); tire.inflate(); return tire; } @Provides Wheels provideWheels(Tire tire){ return new Wheels(tire); }}

خب حالا باید به دگر بفهمونیم که هر وقت این کامپوننت وابسته به Wheels بود وابستگیش رو از کلاس WheelsModule تامین کنه برای اینکار در کلاس AppComponent جلوی انوتیشن component یه پرانتز باز میکنیم و wheelsModule رو بهش معرفی میکنیم اینطوری:

@Component(modules = WheelsModule.class) public interface AppComponent { Car getCar(); void inject(MainActivity activity); }

دیگه نیازی نیست تغیرات دیگه ای ایجاد کنیم فقط کافیه برنامه رو اجرا کنیم میبینیم که به ترتیب لاگ ساخت tire بعد لاگ inflate tire بعد ساخت wheels و بعد ساخت car ایجاد میشه.

daggerدگر
توسعه دهنده موبایل
شاید از این پست‌ها خوشتان بیاید