Dependency injection Dagger:Override@在作用域模块中提供方法

Dependency injection Dagger:Override@在作用域模块中提供方法,dependency-injection,dagger,Dependency Injection,Dagger,让我们假设以下情况。在应用程序的主变量中有一个全局模块AppModule、一个作用域模块ScopedModule、一个类Main和一个类Foo。此外,还有一个调试变量,它有一个模块DebugAppModule、一个模块DebugScopedModule和一个类Bar。只有调试变量可能知道Bar 主要变体包含以下相关代码摘录 @Module AppModule{/*..*/} @模块(injects=Main.class,addsTo=AppModule.class) ScopedModule{@

让我们假设以下情况。在应用程序的主变量中有一个全局模块
AppModule
、一个作用域模块
ScopedModule
、一个类
Main
和一个类
Foo
。此外,还有一个调试变量,它有一个模块
DebugAppModule
、一个模块
DebugScopedModule
和一个类
Bar
。只有调试变量可能知道
Bar

主要变体包含以下相关代码摘录

@Module AppModule{/*..*/}
@模块(injects=Main.class,addsTo=AppModule.class)
ScopedModule{@provideFoo(){返回新的Foo();}}
类Main{scopedGraph=graph.plus(新的ScopedModule(this));}
类Foo{/*..*/}
//在应用程序的入口点中
创建(新的AppModule());
调试变量包含以下相关代码摘录

@Module(addsTo=AppModule.class,overrides=true)DebugAppModule{/*..*/}
@模块(injects=Main.class,addsTo=DebugAppModule.class,overrides=true)
DebugScopedModule{@provideFoo(){返回新条();}}
类栏扩展了Foo{/*..*/}
//在应用程序的入口点中
create(new AppModule(),new DebugAppModule());
我的研究和实验表明,不可能覆盖作用域模块中的
@提供的
-方法,即
加上
加载模块时。例如,见。也就是说,在调试变量中,每当注入
Foo
时,它仍然是
Foo
,而不是
Bar
。这是有意义的,因为类
Main
ScopedModule
有固定的依赖关系(注意
new

在我看来,应该有一种方法来注入作用域模块本身——元注入,也就是说:)。也就是说,
AppModule
可以为
Main
提供
ScopedModule
。问题是
ScopedModule
的构造函数需要一个
Main
的实例,因此
AppModule
需要保留一个
Main
的实例,并且该实例不会飞行(例如,在特定于Android的上下文中,
Main
将是一个活动)


那么,在使用作用域模块时,实现覆盖提供的方法效果的最佳替代方法是什么?

对于Dagger的最新版本,不允许覆盖提供的方法

我找到了一个好办法。多亏了@vaughandroid

基本上, 在组件中提供模块时,可以重写方法

MyComponent component = DaggerMyComponent.builder()
.appModule(new AppModule() {
  @Override public Foo provideFoo() { 
      return new Bar(); 
  }
})
.build();  
这对我有用,我想对你也有用