در بخش قبلی این آموزش مقدمه ای درباره تزریق وابستگی گفته شد ،و در این بخش به تشریح کتابخانه dagger2 می پردازیم .
در بحث تزریق وابستگی سه بخش کلیدی داریم :
چارچوب اصلی dagger2 همین سه بخش بالا می باشند . نکته ای که باید توجه داشته باشید بسیاری از کتابخانه ها برای سهولت استفاده و تمیزتر و کمتر شدن کدها از مبحث Annotation processing استفاده می کنند و dagger هم از این قضیه مستثنا نیست ! پس برای درک واضح این کتابخانه و امثالهم آشنایی با Annotation processing بسیار مهم است .
با یک سناریو کوچیک سه بخش بالارو توضیح میدم :
خب یک Hero داریم که Power های مخصوص خودشو داره !! و کلاس های ما به شکل زیر می باشند :
public class Main { public static void main(String[] args){ Power power = new Power(); Hero hero = new Hero(power); }
public class Hero { Power power ; Hero(Power power) { this.power = power ; } }
public class Power { }
خب حالا میخوایم بحث تزریق وابستگی رو با dagger2 در مثال ساده بالا پیاده کنیم .
این بخش یک کلاس است که با Module@ نشان گذاری می شود و داخل این کلاس متد های با مقدار برگشتی اشیا وجود دارد که با Provides@ نشان گذاری می شود ! برای مثال بالا ارائه دهنده ما به اینصورت است :
import dagger.Module; import dagger.Provides; @Module public class Provider { @Provides static Power providerPower() { return new Power(); } }
ارائه دهنده بالا یک متد به نام providerPower دارد که شی Power را برای ما برمی گرداند ! و کجا این شی مصرف می شود ؟!
در کلاس Hero ما این شی مصرف میشود :|
از حاشیه نویسی Inject برای مشخص کردن مصرف کننده استفاده می شود . برای مثال ما کلاس Hero ما به شکل زیر می شود :
import javax.inject.Inject; public class Hero { Power power ; @Inject Hero(Power power) { this.power = power ; } }
خب و در آخر نوبت به بخش سوم یعنی اتصال ارائه دهنده و مصرف کننده :
این بخش یک اینترفیس است که با حاشیه نویسی Component@ مشخص می گردد و آرگومان این حاشیه نویسی کلاس ارائه دهنده ما است ! برای مثال ما این اتصال دهنده چیزی شبیه :
import dagger.Component; @Component( modules = Provider.class ) public interface Connector { Hero injectPower(); }
اما بعد از build کردن پروژه ،dagger میادو یک کلاس به نام(Dagger + InterfaceName) DaggerConnector درست می کند و از این به بعد ما با این کلاس سروکار داریم تا مستقیما با اشیای دیگر !!
پس ما کد کلاس Main خود را به صورت زیر تغییر می دهیم :
public class Main { public static void main(String[] args) { Hero hero = createHero(); } private static Hero createHero() { Connector connector = DaggerConnector.create(); return connector.injectPower(); } }
تمام !
اگه برای بار اول دارین DI استفاده میکنین و آشناییم با Annotation processing ندارین خیلی خیلی طبیعی که یکم گیج شده باشین ;) ولی آستینارو بالا بزنین و انجامشون بدین .
در بخش بعد این آموزش همین مثال Hero با کمی کامل کردنش در اندروید استدیو پیاده می کنیم .
موفق باشید :)