Sobes.tech
Middle

Dagger çərçivəsi haqqında danışın.

sobes.tech Süni İntellekt

AI-dan cavab

Dagger — bu Java va Android uchun bog‘liqliklarni in'ektsiya qilish (dependency injection, DI) uchun ramka. U JSR-330 spetsifikatsiyasiga asoslangan. Dagger V2 kompilatsiya bosqichida kod generatsiyasidan foydalanadi, bu esa refleksiv DI ramkalariga xos bo‘lgan qo‘shimcha xarajatlarni olib tashlaydi.

Dagger ning asosiy tushunchalari:

  • Modullar (@Module): Bog‘liqliklarni ta'minlaydigan sinflar. Ularning ichida, @Provides bilan belgilangan metodlar Dagger tomonidan in'ektsiya qilinadigan ob'ekt nusxalarini qaytaradi.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Tarkiblar (@Component): Modullar va bog‘liqliklarni in'ektsiya qilish joylarini bog‘laydigan interfeyslar. Ular bog‘liqlik nusxalarini yoki in'ektsiya metodlarini (void inject(Target target);) qaytaradigan metodlarni o‘z ichiga oladi.
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // In'ektsiya metodi
}
  • In'ektsiya (@Inject): Daggerga, qayerga bog‘liqlik ta'minlanishini ko‘rsatadigan annotatsiya. U konstruktorlar, maydonlar va metodlarga qo‘llanilishi mumkin.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Konstruktor orqali in'ektsiya
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Maydon orqali in'ektsiya
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Komponentni olish va bog‘liqliklarni in'ektsiya qilish
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Ko‘lam (@Singleton, @Scope): Ta'minlangan bog‘liqliklarning hayot davomiyligini belgilovchi annotatsiyalar. @Singleton default bo‘lib, o‘zining scope annotatsiyalarini yaratish mumkin.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Dagger ning afzalliklari:

  • Performans: Kompilatsiya bosqichida kod generatsiyasi ishga tushirish vaqtini minimal darajaga tushiradi.
  • Tip xavfsizligi: Bog‘liqlik grafigidagi xatolar kompilatsiya vaqtida aniqlanadi.
  • Tekshirish mumkinligi: Dagger tomonidan generatsiya qilingan kod o‘qilishi oson.
  • Test qilish osonligi: Bog‘liqliklarni mocklar bilan oson almashtirish mumkin.

Kamchiliklar:

  • Qattiq o‘rganish egriysi.
  • Ba'zi hollarda murakkab sintaksis.
  • Kompilatsiya vaqtining oshishi.

Dagger katta Android ilovalarida bog‘liqliklarni boshqarish va kodni tuzishda keng qo‘llaniladi.