英文:
How to specify component for injecting an interface using @Binds in hilt?
问题
以下是翻译的内容:
如果我们试图注入以下类,
class NoComponentRequiredClass @Inject constructor(){}
我们可以在不指定任何组件的情况下进行注入。
然而,如果我们试图提供一个依赖项作为接口的实现,我们必须创建一个模块,并随后必须指定我们要安装的组件。
例如:
interface Test{
fun test()
}
class TestImpl : Test{
override fun test(){}
}
@Module
object Module{
@Binds
fun providesTest(test:TestImpl) : Test
}
除此之外,我还必须指定我们要进行注入的组件。
我希望能够在不指定组件的情况下进行Test的注入(因为NoComponentRequiredClass可以在不指定组件的情况下进行注入)。
如何在不指定组件的情况下注入Test,或者NoComponentRequiredClass是在哪个组件中注入的?
英文:
If we are trying to inject the following class,
class NoComponentRequiredClass @Inject constructor(){}
we can inject it without specifying any component for it to be installed in.
However, if we are trying to provide a dependency as an implementation of an interface, we have to create a Module and subsequently have to specify the component we are trying to installIn.
For example:
interface Test{
fun test()
}
class TestImpl : Test{
overide fun test(){}
}
@Module
object Module{
@Binds
fun providesTest(test:TestImpl) : Test
}
Along with it I have to specify the component we are injecting it on.
I was hoping to inject it without specifying the component (As NoComponentRequiredClass can be injected without specifying component).
How to inject Test without specifying component or in which component is NoComponentRequiredClass injected in?
答案1
得分: -1
在使用 Hilt 时,当使用 @Binds 来为接口提供实现时,您需要定义声明绑定的模块,并指定安装该模块的组件。这是因为 Hilt 需要知道将该绑定关联到哪个组件。
如果您想要注入 Test 而不指定组件,可以使用 @Singleton 作用域。以下是示例:
@Singleton
class TestImpl @Inject constructor() : Test {
override fun test() {}
}
@Module
@InstallIn(SingletonComponent::class) // 指定组件为 SingletonComponent
interface TestModule {
@Binds
fun bindTest(impl: TestImpl): Test
}
TestImpl 类被标注为 @Singleton,这意味着它将作为单例提供。TestModule 安装在 SingletonComponent 中,SingletonComponent 是 Hilt 中预定义的组件。这允许您注入 Test 接口而不需要显式指定组件。
英文:
In Hilt, when using @Binds to provide an implementation for an interface, you need to define the module in which the binding is declared and specify the component where that module is installed. This is because Hilt needs to know which component to associate with the binding.
If you want to inject Test without specifying a component, you can use the @Singleton scope.
Following is example,
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
@Singleton
class TestImpl @Inject constructor() : Test {
override fun test() {}
}
@Module
@InstallIn(SingletonComponent::class) // Specify the component as SingletonComponent
interface TestModule {
@Binds
fun bindTest(impl: TestImpl): Test
}
<!-- end snippet -->
the TestImpl class is annotated with @Singleton, which means it will be provided as a singleton instance. The TestModule is installed in the SingletonComponent, which is a predefined component in Hilt. This allows you to inject the Test interface without explicitly specifying a component.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论