Назад к вопросам
Middle+
122
questionbank
Как в Dagger выполнить инъекцию интерфейса?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Чтобы выполнить инъекцию интерфейса в Dagger, необходимо предоставить конкретную реализацию для него с помощью @Binds или @Provides.
-
@Binds: Предпочтительный способ, если реализация является классом, который Dagger может непосредственно создать (например, с
@Injectконструктором).interface MyInterface { fun doSomething() } class MyInterfaceImpl @Inject constructor() : MyInterface { override fun doSomething() { // ... реализация } } @Module interface MyModule { @Binds fun bindMyInterface(impl: MyInterfaceImpl): MyInterface } -
@Provides: Используется, когда реализация требует более сложной логики создания, например, с использованием сторонней библиотеки или конфигурации.
interface AnotherInterface { fun getData(): String } class AnotherInterfaceImpl : AnotherInterface { private val someValue: String constructor(value: String) { someValue = value } override fun getData(): String { return someValue } } @Module object AnotherModule { @Provides fun provideAnotherInterface(): AnotherInterface { // Сложная логика создания return AnotherInterfaceImpl("some data") } }
Далее, компонент Dagger должен включать эти модули:
@Component(modules = [MyModule::class, AnotherModule::class])
interface AppComponent {
fun inject(activity: MyActivity)
// ...
}
Теперь, в классе, куда необходимо инъецировать интерфейс, достаточно объявить поле с аннотацией @Inject:
class MyActivity : AppCompatActivity() {
@Inject
lateinit var myInterface: MyInterface
@Inject
lateinit var anotherInterface: AnotherInterface
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(application as MyApplication).appComponent.inject(this)
myInterface.doSomething()
val data = anotherInterface.getData()
// ...
}
}