داریوش فتحی
داریوش فتحی
خواندن ۲ دقیقه·۴ سال پیش

وابستگی های زمان اجرا :‌ Dagger 2+ Runtime dependency


مواقعی پیش میاد که dependency که میخوایم تزریق کنیم آماده نیست و باید صبر کنیم تا آماده بشه . dagger به صورت پیش فرض همچین امکانی نداره . مثلا :

class MyViewModel @Inject constructor (privateval dependency: Dependency) { } class Dependency(applicationContext: Context, viewModelScope: CoroutineScope) { // some logic here ... // viewModelScope is a runtime dependency }


اگر توجه کنید کلاس Dependency به viewModelScope نیاز داره و خود ViewModel هم به کلاس Dependency وابسته س . همچنین viewModelScope تا زمانی که خود ViewModel ساخته نشه در دسترس نیست . ولی applicationContext رو از همون ابتدای شروع برنامه داریم

شیر تو شیر!

راه حل چیه؟

در همچین مواردی میتونیم از Factory Pattern استفاده کنیم یا اینکه از لایبرری AssistedInject حضرت Jake Wharton استفاده کنیم که اینم باز میاد از همون Factory Pattern استفاده میکنه. توی این مقاله سعی کردم از Factory Pattern استفاده کنم.

راه حل

برای مثال بالا اینطور عمل می کنیم:

interface DependencyFactory { fun create(viewModelScope: CoroutineScope) : Dependency } class DependencyFactoryImpl(privateval applicationContext: Context) : DependencyFactory { override fun create(viewModelScope: CoroutineScope) : Dependency { return Dependency(applicationContext, viewModelScope) } }

اگر بازم خوب توجه کنید! میبینید که viewModelScope به عنوان پارمتر متد create ارسال شده و مقدار بازگشتی این متد همون چیزیه که ما لازم داریم . پس داخل ViewModel یه همچین چیزی داریم:

class MyViewModel @Inject constructor (privateval dependencyFactory: DependencyFactory ) { val dependency = dependencyFactory.create(viewModelScope) }

به جای اینکه خود Dependency رو تزریق کنیم، factory یش رو تزریق کردیم . توجه کنید برای رعایت حرف D اصول SOLID یا همون Dependency Inversion به جای اینکه Implementation یعنی DependencyFactoryImpl رو تزریق کنیم اومدیم و Abstraction یعنی همون اینترفیس DependencyFactory رو تزریق کردیم (این پاراگراف پر تزریقه !) . اینجوری به قول حرفه ای ها کدمون decouple میشه (کمتر به هم وابسته ن) برای این کار کافیه که وقتی Factory رو داخل گراف Provide میکنید اون رو به DependencyFactory کست کنید


امیدوارم به کارتون بیاد

من همه چی بلد نیستم ولی همچنان در حال یادگیریم . پس اگر مشکلی داشت تو کامنت سکشن بیلو! اشاره کنید


خداقوت / دلتون خوش / غمتون کم / عشقتون زیاد





androiddagger2dependencyinjectionRunTimedependency
توسعه دهنده اندروید و دوست دار طبیعت
شاید از این پست‌ها خوشتان بیاید