Sobes.tech
Middle

გთხოვთ, ისაუბროთ Dagger ჩარჩოზე.

sobes.tech AI

პასუხი AI-სგან

Dagger — бу Java һәм Android өсөн бәйләнештәрҙе инжекторлау (dependency injection, DI) өсөн рамка. Ул 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 ҡушымталары өсөн бәйләнештәрҙе идара итеү һәм код структураһын ойоштороу өсөн киң ҡулланыла.