某个类依赖于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
本身的方法。这种推理有缺陷吗?
答案 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);
}
}
}
这可以通过各种方式进行细化/调整,以便通过构造函数提供注入器依赖性或以其他方式获得。