فرض کنیم کلاس DiselEngine که توی قسمت قبل در موردش حرف زدیم به تنهایی قابل پیاده سازی نیست و نیاز به horsePower داره که مقدارش رو از کاربر در ران تایم باید بگیره. توی کلاس DiselEngine یه فیلد به نام horsePower اضافه کردیم که از کانستراکتور ایم کلاس قراره پرش کنیم و وقتی متد start صدا شد قراره مقدار horsePower رو لاگ بندازیم پس کلاس DiselEngine اینشکلی میشه:
public class DiselEngine implements Engine { private static final String TAG = "Dagger2 DiselEngine" private final int horsePower; @Inject public DiselEngine(int horsePower) { this.horsePower = horsePower; Log.d(TAG, "DiselEngine created"); } @Override public void start() { Log.d(TAG, "DiselEngine started , horsePower = " + horsePower); }}
حالا توی DiselEnginModule باید کلاس بالایی رو بشناسونیم تا وقتی دگر رسید به جایی که میخواست engine تولید کنه بدونه از کجا باید ایجادش کنه و horsePower رو از کجا بیاره پس یه متد provideEngine میسازیم که خروجیش Engine باشه و DiselEngine رو پاس میدیم بهش که در کانستراکتورش توی کلاس بالا گفتیم که یک مقدار int برای horsePower میگیره و این مقدار رو مجددا از DiselEnginModule دریافت میکنیم کلاس DiselEnginModule این شکلی میشه:
@Module public class DiselEnginModule { private final int horsePower; public DiselEnginModule(int horsePower) { this.horsePower = horsePower; } @Provides Engine provideEngin() { return new DiselEngine(horsePower); } }
خب تا اینجا اگه برنامه رو ران کنیم یه خطا میده بهمون و میگه DaggerAppComponent دیگه متدی به نام create نداره و ما خودمون باید builder این کلاس رو صدا بزنیم و مقادیر رو بهش پاس بدیم توی mainActivity که کامپوننت رو ایجاد کرده بودیم میریم و تغییرات رو اینجوری اعمال میکنیم:
AppComponent component = DaggerAppComponent.builder() .diselEnginModule(new DiselEnginModule(120)).build();
یعنی به دگر گفتیم که هروقت نیاز به تولیدEngine داشتی برو DiselEnginModule رو پیدا کن و مقدار
horsePower رو مساوی با 120 قرار بده اگه برنامه رو اجرا کنیم لاگ هامون این شکلی میشه :
D: DiselEngine created
D: Tire Created
D: Tire inflated
D: Wheels Created
D: car created
D: DiselEngine started , horsePower = 120
D: driving