Sobes.tech
Middle+

Разкажи за анотациите Dagger @Provides и @Binds

sobes.tech AI

Отговор от AI

Забележката @Provides се използва в модулите за определяне на методи, които създават екземпляри на зависимости. Тези методи са маркирани с @Provides и връщат типа на зависимостта, която предоставят. В тялото на метода се съдържа логиката за създаване на екземпляра.

@Module
class AppModule {

    @Provides
    fun provideDatabase(context: Context): AppDatabase {
        // Логика за създаване на базата данни
        return Room.databaseBuilder(context, AppDatabase::class.java, "app-database").build()
    }
}

Анотацията @Binds се използва в модулите, за да посочи, че един интерфейс е свързан с конкретна реализация. Тя се прилага към абстрактни методи, които приемат като параметър реализацията и връщат интерфейса. Dagger генерира по-ефективен код за @Binds в сравнение с @Provides, тъй като не е необходимо извикване на метод за създаване на екземпляра.

@Module
interface AppBindsModule {

    @Binds
    fun bindRepository(impl: DefaultRepository): Repository
}

interface Repository { /* ... */ }
class DefaultRepository @Inject constructor(): Repository { /* ... */ }

Основни разлики:

  • @Provides се използва за създаване на екземпляри на обекти, често изискващи по-сложна логика или зависимости.
  • @Binds се използва за свързване на абстрактни типове (интерфейси) с техните конкретни реализации, което е по-ефективно, когато няма сложна логика за създаване.