Sobes.tech
Middle

Pastāstiet par Dagger ietvaru.

sobes.tech AI

Atbilde no AI

Dagger ir rāmja priekš atkarību injekcijas (dependency injection, DI) Java un Android vidēs. Tas balstās uz JSR-330 specifikāciju. Dagger V2 izmanto koda ģenerēšanu kompilācijas laikā, kas novērš izpildes laikā raksturīgās izmaksas, kas raksturīgas refleksīviem DI rāmjiem.

Dagger galvenās jēdzieni:

  • Moduļi (@Module): Klases, kas nodrošina atkarības. Tajās iezīmētās @Provides metodes atgriež objektu eksemplārus, kurus Dagger var injicēt.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Komponenti (@Component): Saziņas interfeisi, kas savieno moduļus un injekcijas vietas. Tie satur metodes, kas atgriež atkarību eksemplārus vai injekcijas metodes (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Injekcijas metode
}
  • Injekcija (@Inject): Anotācija, kas norāda Dagger, kur jānodrošina atkarība. To var lietot konstruktoros, laukos un metodēs.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Injekcija caur konstruktoru
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Injekcija caur lauku
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Komponenta iegūšana un atkarību injekcija
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Aptvērums (@Singleton, @Scope): Anotācijas, kas nosaka nodrošināto atkarību dzīves cikla ilgumu. Pēc noklusējuma ir @Singleton, bet var izveidot savas apgabala anotācijas.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Dagger priekšrocības:

  • Veiktspēja: Koda ģenerēšana kompilācijas laikā samazina izpildes laikā radušās izmaksas.
  • Tipu drošība: Kļūdas atkarību grafikā tiek atklātas kompilācijas laikā.
  • Pārbaudāmība: Dagger ģenerētais kods ir lasāms.
  • Viegla testēšana: Atkarības viegli var aizstāt ar mock objektiem.

Trūkumi:

  • Steile mācīšanās līkne.
  • Dažos gadījumos — sarežģīta sintakse.
  • Palielināts kompilācijas laiks.

Dagger aktīvi tiek izmantots lielās Android lietojumprogrammās atkarību pārvaldībai un koda strukturēšanai.