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

دگر آسونه قسمت 3 (Binds@)

خب از binds وقتی استفاده میکنیم که وابستگی به اینترفیس یا کلاس ابسترکتی داشته باشیم توی مثال قبل

فرض کنیم Engine یک اینترفیس هستش که یک متد داره به نام start که این متد هرجایی که قراره از این اینترفیس ارث بری بشه پیاده سازی میشه نحوه روشن شدن موتور هر ماشین یک جور خاص پیاده سازی میشه حالا برای اینکه بخوایم با دگر این وابستگی رو برطرف کنیم یا از انوتیشن provides استفاده میکنیم یا از binds اول provides رو بررسی کنیم .

Engine به این شکل هست:

public interface Engine { void start(); }

خب حالا یه کلاس میسازیم که از Engine ارث بری کنه به نام DiselEngine که اینشکلیه:

public class DiselEngine implements Engine { private static final String TAG = &quotDiselEngine&quot @Inject public DiselEngine() { } @Override public void start() { Log.d(TAG, &quotstart: DiselEngine&quot); }}

چون این کلاس اکسترنال لایبرری هست ما از ماژول برای شناسوندن وابستگی ها استفاده میکنیم پس یه کلاس DiselEngineModule هم میسازیم که داری انوتیشن module هست و یه متد داخلش قرار میدیم که خروجی اون متد Engine هست

@Module public class DiselEnginModule { @Provides Engine provideEngin() { return new DiselEngine(); } }
نکته : وقتی توی ماژول متدهارو استاتیک میکنید، دیگه دگر مجبور نیست برای فراخوانی متد‌های کلاس ماژولتون یک object ازش بسازه و میتونه بدون اینکار مستقیما متدهارو صدا بزنه، در نتیجه بازدهی بالاتر میره.

با توجه به نکته ی بالا اگه ماژلمون این شکلی باشه بازده بهتری داریم:

@Module public class DiselEnginModule { @Provides static Engine provideEngin() { return new DiselEngine(); } }

توی AppComponent هم ماژولش رو اضافه میکنیم:

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

اگه خروجی بگیریم میبینیم که ترتیب لاگها این شکلی میشن:

D: DiselEngine created
D: Tire Created
D: Tire inflated
D: Wheels Created
D: car created
D: DiselEngine started
D: driving

یه روش دیگه اینه که از binds استفاده کنیم برای استفاده از binds باید توی DiselEnginModule چند تا تغییر بدیم اول اینکه متد و کلاسمون رو abstract کنیم دوم اینکه بالای متدمون انوتیشن @Binds بزنیم سوم اینکه DiselEngin رو به عنوان ورودی به متدمون بفرستیم و متدمون هم بدنه نداشته باشه.بعد از اجرا بازک خروجی بالا رو خواهیم داشت . یعنی این شکلی:

@Module public abstract class DiselEnginModule { @Binds abstract Engine bindEngine(DiselEngine diselEngine); }



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