Eug*_*gen 5 dependency-injection dagger
让我们假设以下情况.应用程序的主要变体中有一个全局模块AppModule,一个作用域模块ScopedModule,一个类Main和一个类.此外,还有一个带有模块,模块和类的调试变体.只有调试变体可能知道. FooDebugAppModuleDebugScopedModuleBarBar
该主变体包含以下相关的代码片段.
@Module AppModule { /*..*/ }
@Module(injects=Main.class, addsTo=AppModule.class)
ScopedModule { @Provides Foo provideFoo() { return new Foo(); } }
class Main { scopedGraph = graph.plus(new ScopedModule(this)); }
class Foo { /*..*/ }
// In the entry point of the application
ObjectGraph.create(new AppModule());
Run Code Online (Sandbox Code Playgroud)
在调试的变体包含以下相关的代码片段.
@Module(addsTo=AppModule.class, overrides=true) DebugAppModule { /*..*/ }
@Module(injects=Main.class, addsTo=DebugAppModule.class, overrides=true)
DebugScopedModule { @Provides Foo provideFoo() { return new Bar(); } }
class Bar extends Foo { /*..*/ }
// In the entry point of the application
ObjectGraph.create(new AppModule(), new DebugAppModule());
Run Code Online (Sandbox Code Playgroud)
我的研究和实验表明,不可能@Provides在作用域模块中覆盖 - 方法,即在plus模块化时.请参阅示例如何模拟匕首活动对象图.也就是说,在调试变体中,无论何时Foo注入a Foo,它仍然是a 而不是a Bar.这是有道理的,因为类Main具有固定的依赖性ScopedModule(注意new).
在我看来应该有一种方法来自己注入范围模块 - 元注入这样说:).也就是说,AppModule可以提供ScopedModule为Main.问题是ScopedModule构造函数需要一个实例,Main因此AppModule需要保留一个实例Main并且不会飞(例如,在Android特定的上下文中,Main它将是一个Activity).
那么@Provides在使用作用域模块时,实现覆盖方法效果的最佳替代方法是什么?
使用最新版本的 Dagger,不允许重写 @Provided 方法。
我在这里找到了一个很好的解决方案。感谢@vaughandroid
基本上,当您将模块提供到组件中时,您可以覆盖您的方法。
MyComponent component = DaggerMyComponent.builder()
.appModule(new AppModule() {
@Override public Foo provideFoo() {
return new Bar();
}
})
.build();
Run Code Online (Sandbox Code Playgroud)
这对我有用,我想它也会对你有用。
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |