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

时间:2015-03-31 06:59:55

标签: android dagger

TL; DR;

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


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

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 个答案:

答案 0 :(得分:1)

要回答我自己的问题,看起来这是可以接受的。 u2020 sample app做了类似的事情。事实上,它使用getSystemService()非常巧妙地实现了这一点,但这是特定于Android的。请特别注意Injector.java及其在TrendingView

等自定义视图中的使用方式

因此,从概念上讲,人们可以做这样的事情 - 它基本上抽象了ObjectGraph接口背后的具体Injector依赖。

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);
        }
    }
}

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