Назад к вопросам
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()  
        // ...  
    }  
}