繁体   English   中英

[Dagger 1.x]:是否将ObjectGraph本身指定为类的依赖项?

[Dagger 1.x]: Specifying the ObjectGraph itself as a dependency for a class?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

TL; DR;

类依赖于ObjectGraph本身是否可以接受?


我需要这样做是因为我需要注入对在运行时加载的某些对象的依赖关系-在与ObjectGraph初始化时断开的时间。 这是一个示例,说明了我如何使用ServiceLoader框架在运行时加载Service的具体实现类,然后将依赖项注入已加载的实现类中。

interface Plugin {
    void doSomething();
}

class AwesomePlugin implements plugin {
    @Inject DependencyOne dependencyOne; 
    @Inject DependencyTwo dependencyTwo;
    void doSomething(){
        // ...some implementation...
    }
}

class PluginEngine{
    public void start(){
        ServiceLoader<Plugin> pluginLoader = ServiceLoader.load(Plugin.class);
        for(Plugin plugin: pluginLoader){
            //TODO: Inject plugin dependencies here
        }
    }
}

为此,需要PluginEngine类有权访问ObjectGraph实例:

class PluginEngine{
    private final ObjectGraph objectGraph;

    public PluginEngine(ObjectGraph graph){
        this.objectGraph = graph;
    }

    public void start(){
        ServiceLoader<Plugin> pluginLoader = ServiceLoader.load(Plugin.class);
        for(Plugin plugin: pluginLoader){
            objectGraph.inject(plugin);
        }
    }
}

这是代码气味吗? 这是在我的代码的其他地方,还是在我的依赖项设置方式上指出了一些问题?

在撰写这个问题时,我开始看到Dagger的作用,它是用ObjectGraph本身的依赖关系替换任意依赖关系的一种方法。 在Android上,您使用对自定义Application子类的引用,并使用它执行注入-基本上,这只是一种访问ObjectGraph本身的方法。 这种推理有缺陷吗?

1 个回复

要回答我自己的问题,看来这是可以接受的。 u2020示例应用程序执行的操作大致相似。 实际上,它非常巧妙地使用getSystemService()来实现这一点,但这是Android特有的。 特别是,请查看Injector.java以及如何在诸如TrendingView之类的自定义视图中使用它

因此,从概念上讲,人们可以做这样的事情-基本上将Injector接口后面的具体ObjectGraph依赖关系抽象出来。

class PluginEngine{
    private final Injector injector;

    public PluginEngine(Injector injector){
        this.injector = injector;
    }

    public void start(){
        ServiceLoader<Plugin> pluginLoader = ServiceLoader.load(Plugin.class);
        for(Plugin plugin: pluginLoader){
            injector.inject(plugin);
        }
    }
}

这可以通过各种方式进行完善/调整,以便通过构造函数提供喷射器依赖性或以其他方式获得喷射器依赖性。

3 如何在Play中包含“提供的”依赖项! 框架1.x

我们正在使用Play! 框架1.x及其依赖管理机制 。 在阅读了文档并四处搜寻之后,我仍然不知道如何(或是否可能)从dependencies.yml引用提供的依赖关系,其中提供意味着即使应用程序依赖于库进行编译,它不应包含在应用程序的lib文件夹中,因为该库是在运行时由环境(应用程序服务 ...

8 是否可以注入匕首ObjectGraph?

我想创建作业管理器,该作业可以具有可注射成员。 jobManager.queueJob(new Job1()); 作业排队后,我想在开始之前调用对象图并注入作业字段。 从JobManager类访问对象图的正确方法是什么? 目前,我正在注入具有ObjectGraph的get ...

2014-05-09 19:03:07 2 306   dagger
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM