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();
这对我有用,我想对你也有用