Dagger2:是否可以基于 Android 版本进行注入?

Dagger2: Is it possible to inject based on Android Version?

是否可以使用Dagger2根据SDK版本注入具体实现?

例如

// MediaPlayerComponent.class
@Component(modules = {MediaPlayerModule.class}
public interface MediaPlayerComponent
{
    void inject(MediaPlayerUI ui)
}

// MediaPlayerUI.java
public class MediaPlayerUI
{
    @Inject
    public MediaPlayer mPlayer;
}

// GingerbreadMediaPlayer.java
public class GingerbreadMediaPlayer extends MediaPlayer {...}

// IceCreamSandwichMediaPlayer.java
public class IceCreamSandwichMediaPlayer extends MediaPlayer {...}

是的,只需决定在 MediaPlayerModule 模块中用 @Provides 注释的具体方法中返回两个实现中的哪一个,returns 通用 MediaPlayer.

理论上是可行的,我以前没有做过,因为我没有必要,但我认为以下情况可行:

  • 您应该有一个父 ApplicationComponent 来定义您的应用程序的需求。我们称它为 ApplicationComponent。
  • 现在假设您希望 API21 及以上和 API 低于 21 有 2 个不同的依赖项。您应该创建两个从应用程序组件继承的组件,我们称它们为 Application21Component 和ApplicationBelow21组件。
  • 对于这两个组件中的每一个,您都应该有一个不同的 ApplicationModule,它告诉您应用程序组件如何获取所需的依赖项
  • 在您的应用程序中 class "getComponent" 函数的主体将类似于以下内容

    public ApplicationComponent getComponent(){ if (mApplicationComponent == null) { if (Build.VERSION.SDK_INT >= 21) { mApplicationComponent = DaggerApplication21Component.builder() .applicationModule(new ApplicationModule(this)) .build(); } else { mApplicationComponent = DaggerApplicationBelow21Component.builder() .applicationModule(new ApplicationModule(this)) .build(); } } return mApplicationComponent; }