Middle
Meséljen a Dagger keretről.
sobes.tech MI
Válasz az MI-től
Dagger — ez egy függőség-injektálási (dependency injection, DI) keretrendszer Java és Android számára. A JSR-330 specifikációra épül. A Dagger V2 kódgenerálást használ fordítási időben, ez kiküszöböli a futási időben jellemző reflexiós DI-keretrendszerek költségeit.
A Dagger kulcsfogalmai:
- Modulok (
@Module): Osztályok, amelyek függőségeket szolgáltatnak. Ezekben a metódusok, melyeket@Provides-szel jelöltek, példányokat adnak vissza, amelyeket a Dagger be tud injektálni.
@Module
public class AppModule {
@Provides
Context provideAppContext(Application app) {
return app.getApplicationContext();
}
}
- Komponensek (
@Component): Interfészek, amelyek összekötik a modulokat és a függőség-injektálási helyeket. Tartalmaznak metódusokat, amelyek függőségeket adnak vissza vagy injektálási metódusokat (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
Context getAppContext();
void inject(MyApplication application); // Injektálási metódus
}
- Injektálás (
@Inject): Anotáció, ami megmutatja a Dagger-nek, hol kell biztosítani a függőséget. Alkalmazható konstruktorokra, mezőkre és metódusokra.
public class UserManager {
private final UserRepository userRepository;
@Inject // Injektálás konstruktoron keresztül
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
public class MainActivity extends AppCompatActivity {
@Inject // Injektálás mezőn keresztül
UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
// Komponens beszerzése és függőségek injektálása
((MyApplication) getApplication()).getAppComponent().inject(this);
}
}
- Hatókör (
@Singleton,@Scope): Anotációk, amelyek meghatározzák a biztosított függőségek élettartamát. Alapértelmezett a@Singleton, de saját hatókör anotációk is létrehozhatók.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}
@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
A Dagger előnyei:
- Teljesítmény: A kód generálása fordítási időben minimalizálja a futási időbeli költségeket.
- Típusbiztonság: A függőségi gráf hibái fordítási időben felismerhetők.
- Ellenőrizhetőség: A Dagger által generált kód olvasható.
- Tesztelhetőség: A függőségek könnyen helyettesíthetők mock-okat használva.
Hátrányok:
- Nagy tanulási görbe.
- Bizonyos esetekben bonyolult szintaxis.
- Növekvő fordítási idő.
A Dagger aktívan használatos nagy Android-alkalmazásokban a függőségek kezelésére és a kód szervezésére.