Sobes.tech
Middle

Papaskinkite apie Dagger karkasą.

sobes.tech AI

Atsakymas iš AI

Dagger yra karkasas priklausomybių injekcijai (dependency injection, DI) Java ir Android aplinkose. Jis pagrįstas JSR-330 specifikacija. Dagger V2 naudoja kodo generavimą kompiliacijos metu, kas pašalina vykdymo metu būdingas išlaidas, būdingas refleksiniams DI karkasams.

Dagger pagrindinės sąvokos:

  • Moduliai (@Module): Klasės, kurios teikia priklausomybes. Joje pažymėtos @Provides metodai grąžina objektų pavyzdžius, kuriuos Dagger gali injekuoti.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Komponentai (@Component): Sąsajos, kurios jungia modulius ir injekcijos vietas. Jos turi metodus, kurie grąžina priklausomybių pavyzdžius arba injekcijos metodus (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Injekcijos metodas
}
  • Injekcija (@Inject): Anotacija, rodanti Dagger, kur turi būti teikiama priklausomybė. Ji gali būti taikoma konstruktoriams, laukams ir metodams.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Injekcija per konstruktorių
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Injekcija per lauką
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Gauti komponentą ir injekuoti priklausomybes
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Aprėptis (@Singleton, @Scope): Anotacijos, kurios apibrėžia teikiamų priklausomybių gyvavimo laiką. Numatyta @Singleton, tačiau galima kurti savo apimties anotacijas.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Dagger privalumai:

  • Našumas: Kodo generavimas kompiliacijos metu sumažina vykdymo metu patiriamas išlaidas.
  • Tipų saugumas: Klaidos priklausomybių grafike aptinkamos kompiliacijos metu.
  • Testuojamumas: Dagger sugeneruotas kodas yra skaitomas.
  • Lengvas testavimas: Priklausomybes lengvai galima pakeisti mock'ais.

Trūkumai:

  • Staigi mokymosi kreivė.
  • Kartais sudėtinga sintaksė.
  • Padidėjęs kompiliacijos laikas.

Dagger aktyviai naudojamas dideliuose Android projektuose priklausomybių valdymui ir kodo struktūrizavimui.