【问题标题】:whats the difference between @Provide and @Inject in dagger2?dagger2 中的@Provide 和@Inject 有什么区别?
【发布时间】:2021-10-17 19:02:05
【问题描述】:

@Inject 和@Provide 有什么区别?

虽然两者都是用来提供依赖的,但是有什么区别呢?

【问题讨论】:

    标签: android kotlin dagger-2 dagger


    【解决方案1】:

    documentation@Inject@Provides 很好地涵盖了这一点,它们是在依赖关系图中引入依赖关系的两种不同方式。它们适用于不同的用例

    @Inject

    1. 简单易用,只需在构造函数或属性上添加@Inject即可完成
    2. 它可用于注入类型以及类型属性
    3. 在某些人看来,从主观上看,它可能比 @Provides 更清晰

    @Provides

    1. 如果您无权访问您要注入的类型的源代码,那么您不能用@Inject 标记它的构造函数
    2. 在某些情况下,您可能希望在将对象引入依赖关系图之前对其进行配置,这不是@Inject 的选项
    3. 有时您想引入一个接口作为依赖项,为此您可以创建一个带有@Provides 注释的方法,该方法返回接口类型

    以下是@Provides以上三点的例子


    如果您无法访问某个类型的源代码

    // You can't mark constructor of String with @Inject but you can use @Provides
    
    @Provides
    fun provideString(): String {
        return "Hello World"
    }
    

    在引入依赖图之前配置一个对象

    @Provides
    fun provideCar(): Car {
        val car = Car()
        // Do some configuration before introducing it in graph, you can't do this with @Inject
        car.setMaxSpeed(100)
        car.fillFuel()
        return car
    }
    

    在依赖图中注入接口类型

    interface Logger { fun log() }
    class DiscLogger : Logger{ override fun log() { } }
    class MemoryLogger : Logger { override fun log() { } }
    
    @Provides
    fun provideLogger(): Logger {
        val logger = DiscLogger() \\ or MemoryLogger()
        return logger
    }
    

    【讨论】:

      【解决方案2】:

      @Inject:- 用于在类中注入依赖项。 @provides:- 需要在创建实际实例的地方使用 @provide 注释方法。

      【讨论】:

        猜你喜欢
        • 2011-11-25
        • 2011-08-18
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 2019-12-16
        • 2016-09-15
        相关资源
        最近更新 更多