Sobes.tech
Middle

Rääkige Daggeri raamist.

sobes.tech AI

Vastus AI-lt

Dagger on raamistiku sõltuvuste süstimiseks (dependency injection, DI) Java ja Androidi jaoks. See põhineb JSR-330 spetsifikatsioonil. Dagger V2 kasutab koodi genereerimist kompileerimise ajal, mis kõrvaldab jooksva aja kulud, mis on tüüpilised refleksiivsetele DI raamistikule.

Daggeri põhiteadmised:

  • Moodulid (@Module): Klassid, mis pakuvad sõltuvusi. Nendes märgitud @Provides meetodid tagastavad objektide eksemplare, mida Dagger saab süstida.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Komponendid (@Component): Liidesed, mis ühendavad mooduleid ja süstimise kohti. Nad sisaldavad meetodeid, mis tagastavad sõltuvuste eksemplare või süstimise meetodeid (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Süstimise meetod
}
  • Süstimine (@Inject): Anotatsioon, mis näitab Daggerile, kuhu tuleb sõltuvus pakkuda. Seda saab kasutada konstruktoritel, väljad ja meetodid.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Süstimine konstruktoriga
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Süstimine väljal
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Komponendi saamine ja sõltuvuste süstimine
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Vahemik (@Singleton, @Scope): Anotatsioonid, mis määravad pakutavate sõltuvuste eluea. Vaikimisi on @Singleton, kuid saab luua ka oma vahemiku anotatsioone.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Daggeri eelised:

  • Tõhusus: Koodi genereerimine kompileerimise ajal minimeerib jooksva aja kulud.
  • Tüübiturvalisus: Viga graafikus avastatakse kompileerimise ajal.
  • Kontrollitavus: Daggeri genereeritud kood on loetav.
  • Lihtne testimine: Sõltuvusi saab hõlpsasti asendada mock-idega.

Puudused:

  • Järsk õppimiskõver.
  • Mõnikord keeruline süntaks.
  • Pikeneb kompileerimise aeg.

Dagger on aktiivselt kasutusel suurtes Android rakendustes sõltuvuste haldamiseks ja koodi struktuuri korraldamiseks.