Sobes.tech
Middle

дар бораи чорчӯбаи Dagger гап занед.

sobes.tech AI

Ҷавоб аз AI

Даггер — ин рамка барои ворид кардани вобастагиҳо (dependency injection, DI) дар Java ва Android. Он асос ёфтааст ба спецификацияи JSR-330. Dagger V2 истифода мебарад аз тавлиди код дар марҳилаи компилятсия, ки хароҷоти дар вақти иҷроиро, ки одатан барои рамзҳои DI рефлексивӣ аст, бартараф мекунад.

Масоили калидии Dagger:

  • Модулҳо (@Module): Синфҳо, ки вобастагиҳоро таъмин мекунанд. Дар дохили онҳо, методҳое, ки бо @Provides нишон дода шудаанд, намунаҳои объектҳоро бармегардонанд, ки Dagger метавонад ворид кунад.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Компонентҳо (@Component): Интерфейсҳо, ки модулҳоро ва ҷойҳои воридкунии вобастагиҳоро пайваст мекунанд. Онҳо методҳоро доранд, ки намунаҳои вобастагиҳоро бармегардонанд ё методҳои воридкунӣ (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Метод воридкунӣ
}
  • Воридкунӣ (@Inject): Анотация, ки нишон медиҳад, ки Dagger бояд дар куҷо вобастагиро таъмин кунад. Мебошад ба конструкторҳо, майдонҳо ва методҳо истифода шавад.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Воридкунӣ тавассути конструктор
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Воридкунӣ тавассути майдон
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Гирифтани компонент ва ворид кардани вобастагиҳо
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Диапазон (@Singleton, @Scope): Анотацияҳо, ки вақти зиндагии вобастагиҳоро муайян мекунанд. @Singleton ҳамчун пешфарз аст, аммо метавон анотацияҳои диапазони худро сохт.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
}

Афзалиятҳои Dagger:

  • Кам кардани хароҷот: Тавлиди коди дар марҳилаи компилятсия минимизатсия мекунад хароҷоти дар вақти иҷро.
  • Бехатарии навъҳо: Хатогиҳо дар графи вобастагиҳо дар марҳилаи компилятсия ошкор мешаванд.
  • Таҳлилшавандагӣ: Коди тавлидшудаи Dagger хонданӣ аст.
  • Осон кардани тест: Вобастагиҳоро ба осонӣ бо мокҳо иваз кардан мумкин аст.

Норасоиҳо:

  • Курсии баланд дар омӯзиш.
  • Синтаксиси мураккаб дар баъзе ҳолатҳо.
  • Вақти зиёдтар барои компилятсия.

Dagger дар барномаҳои Androidи калон барои идоракунии вобастагиҳо ва сохтори коди истифода мешавад.