首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Dagger2中命名的不同字段注入同一个类的两个对象

使用Dagger2中命名的不同字段注入同一个类的两个对象
EN

Stack Overflow用户
提问于 2021-10-01 09:07:58
回答 2查看 237关注 0票数 0

假设我有实现形状接口的矩形类

代码语言:javascript
复制
class Rectangle @Inject constructor(private val id: String) : Shape {
    override fun info() {
        Log.d("Rectangle", "I am rectangle!, My id is $id")
    }
}
代码语言:javascript
复制
interface Shape {
    fun info()
}

使用@Named提供同一个类的两个不同id的对象的一种方法是在我的模块中:

代码语言:javascript
复制
@Module
class AppModule {

    @Provides
    @Named("Id1")
    fun provideId1(): Shape {
        return Rectangle("Id1")
    }

    @Provides
    @Named("Id2")
    fun provideId2(): Shape {
        return Rectangle("Id2")
    }
}

这样,我就可以在我的主体活动中注入两个矩形对象。

代码语言:javascript
复制
    @Inject
    @field:Named("Id1")
    lateinit var rect1: Shape

    @Inject
    @field:Named("Id2")
    lateinit var rect2: Shape

不过,我希望我的模块看起来有点不同。在其中,我希望为对象提供形状和使用@named构造函数参数。我拥有的是:

代码语言:javascript
复制
  @Module
class AppModule {

    @Provides
    @Named("Id1")
    fun provideId1(@Named("id1") id: String): Shape {
        return Rectangle(id)
    }

    @Provides
    @Named("Id2")
    fun provideId2(@Named("id2") id: String): Shape {
        return Rectangle(id)
    }

    @Provides
    @Named("id1")
    fun provideId1(): String {
        return "ABC"
    }

    @Provides
    @Named("id2")
    fun provideId2(): String {
        return "XYZ"
    }
}

如何使用这种方法实现两个具有不同构造函数参数的对象的注入?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-01 12:17:38

根据我的评论,

啊哈,我明白了。我认为。他们不可能在同一个模块里。原因是:当模块正在处理时,它将提供命名字符串,但它们不会在图中满足提供那些命名参数的矩形提供方法的条件。您将需要将提供字符串的方法移动到不同的模块,并使您的AppModule将其用作依赖项。那就应该管用了。然而,这只是一个尽最大努力的猜测。

试着做这样的事情:

代码语言:javascript
复制
@Module(include = StringProvidingModule::class)
class AppModule {

    @Provides
    @Named("Id1")
    fun provideId1(@Named("id1") id: String): Shape {
        return Rectangle(id)
    }

    @Provides
    @Named("Id2")
    fun provideId2(@Named("id2") id: String): Shape {
        return Rectangle(id)
    }
}

@Module
class StringProvidingModule {

    @Provides
    @Named("id1")
    fun provideId1(): String {
        return "ABC"
    }

    @Provides
    @Named("id2")
    fun provideId2(): String {
        return "XYZ"
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-10-01 09:32:31

这是你错过的关键部分:

代码语言:javascript
复制
@Module
class AppModule {

    @Provides
    @Named("ShapeId1")
    fun provideId1(@Named("id1") id: String): Shape {
        return Rectangle(id)
    }

    @Provides
    @Named("ShapeId2")
    fun provideId2(@Named("id2") id: String): Shape {
        return Rectangle(id)
    }
}

自动将提供的命名字符串放入实际矩形构造函数的部分。

然而,我会选择一些更简单、更干净的东西,比如:

代码语言:javascript
复制
RectangleNamed1Module.kt:

@Module(includes = [RectangleNamed1ProvidingModule::class])
internal interface RectangleNamed1Module {

    @Binds
    @Named("ShapeID1")
    fun bindRectangle(rectangle: Rectangle): Shape
}

@Module
internal object RectangleNamed1ProvidingModule {

    @Provides
    fun provideRectangle(
        @Named("id1") stringId: String
    ): Rectangle = Rectangle(stringId)
}

那你就可以..。复制此模块的次数,只要您需要,并稍微更改命名的依赖关系/参数,就这样吧。

您可以使用它作为RectangleNamed1Module和RectangleNamed2Module,然后使这两个模块成为AppModule的依赖。只要你想注入两个形状/矩形,叫做"Shape1“和"Shape2”就行了,对吧?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69403336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档