Dagger 2 如何在任何地方访问相同的组件

死亡天使908

如何创建一个可以从代码中的任何位置访问的单例对象?

  • 无法使用 dagger 创建对象(1),我想从中注入我的 signleton 组件。
  • 这些对象没有我可以访问的公共依赖项(例如 getApplication()

快速举个例子:

注入类

public class InjectedClass {
    public InjectedClass() {
        System.out.println("injected class created");
    }
}

持有人A类

public class HolderClassA { // this is one of object I marked with (1)
    @Inject InjectedClass b;
    public HolderClassA() {
        Injector build = DaggerInjector.builder().build();
        build.inject(this);
        System.out.println(b);
    }
}

持有人B类

public class HolderClassB { // this is another object I marked with (1)
    @Inject InjectedClass b;
    public HolderClassB() {
        Injector build = DaggerInjector.builder().build();
        build.inject(this);
        System.out.println(b);
    }
}

提供者

@Module
public class Provider {

    @Provides
    @Singleton
    InjectedClass provideInjectedClass() {
        return new InjectedClass();
    }
}

注射器

@Component(modules = {Provider.class})
@Singleton
public interface Injector {

    void inject(HolderClassA a);
    void inject(HolderClassB a);

}

代码中的某处

new HolderClassA();

代码中的其他地方与以前的代码没有任何关系,也没有相同的父级或可以访问相同的对象(如在 dagger guide 中getApplication()):

new HolderClassB();

实际结果:InjectedClass 的两个实例被打包

预期结果:创建单个实例InjectedClass

问题是DaggerInjector.builder().build();创建了彼此不了解的不同范围。例如,我可以通过创建静态变量DaggerInjector.builder().build()并从中调用注入来解决这个问题但因此它不再是依赖注入,而是不再是简单的单例模式。

德班扬

根据我从评论中的理解,您需要为持有者类使用单独的组件,以便注入相同的实例?如果我错了,请原谅我。你可以试试这个。

@Component(modules = arrayOf(AppModule::class))
@Singleton
interface AppComponent {
    //sub components
    fun plusHolderClass1(holderModule: HolderModule1):HolderComponent1
    fun plusHolderClass2(holderModule: HolderModule2):HolderComponent2    
    //provision methods
    fun getInjectedClass():InjectedClass
}

这是您的应用程序组件或顶级组件,您在应用程序中初始化,当然使用您的 Module 类,它将提供 Injected 类作为单例。

@Subcomponent(modules = arrayOf(HolderModule1::class))
@ActivityScope
interface HolderComponent1{
    fun inject(holder:Holder1)
}

和 Holder2 类的类似。您可以在模块中定义本地范围依赖项。

但是当然即使在这种情况下,您也必须将 appComponent 的实例存储在 Application 类中。

注射时

appComponent.plusHolderComponent1(HolderModule1()).inject(yourObject)

InjectedClass 对象将通过从配置方法中获取来注入到 yourObject

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

axis2 jar 无法在任何地方下载

来自分类Dev

Dagger 2子组件与组件依赖关系

来自分类Dev

将 Apache2 设置为可从任何地方访问

来自分类Dev

如何在任何地方运行Appimage?

来自分类Dev

Dagger 2子组件注入错误

来自分类Dev

Dagger2范围,每个组件实例

来自分类Dev

跨 Android 模块的 Dagger 2 子组件

来自分类Dev

如何在Nuxt中定义全局变量以在任何地方访问

来自分类Dev

ec2实例计划的事件的历史记录在任何地方都可用?

来自分类Dev

如何使用Dagger 2注入Servlet?

来自分类Dev

如何避免 Dagger 2 的循环依赖?

来自分类Dev

如何从任何地方访问Zoo组件数据

来自分类Dev

如何使用Dagger 2在ViewPager中注入相同片段的ViewModel

来自分类Dev

Java / IntelliJ无法识别Dagger2组件的“ Dagger”关键字

来自分类Dev

如何在LibGDX中正确使用Dagger 2的场注入?

来自分类Dev

如何在Dagger 2中使用@Scope

来自分类Dev

Dagger 2,如何在依赖项中添加接口

来自分类Dev

如何解决错误:使用Dagger2进行翻新时出现[Dagger / MissingBinding]

来自分类Dev

Dagger2不生成Dagger *类

来自分类Dev

Phoenix Framework:未定义的函数LetsPlan.Event.fetch / 2。但是获取功能未在任何地方记录

来自分类Dev

Dagger 2的依赖注入

来自分类Dev

Dagger 2组件依赖项不起作用

来自分类Dev

Dagger2 子组件错误 - 必须注释方法 ArrayAdapter

来自分类Dev

Android Dagger2,单例交叉组件

来自分类Dev

Dagger 2. 空测试组件未解决

来自分类Dev

android studio 中未生成 Dagger 2 组件

来自分类Dev

Dagger 2注入相同对象类型的多个实例

来自分类Dev

用户专有信息可在任何地方访问。如何保护它?

来自分类Dev

如何使我的批处理代码成为我可以在任何地方访问的命令?

Related 相关文章

热门标签

归档