Dagger:在Scoped模块中覆盖@ Provide-Method

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可以提供ScopedModuleMain.问题是ScopedModule构造函数需要一个实例,Main因此AppModule需要保留一个实例Main并且不会飞(例如,在Android特定的上下文中,Main它将是一个Activity).

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

ilk*_*tas 0

使用最新版本的 Dagger,不允许重写 @Provided 方法。

在这里找到了一个很好的解决方案。感谢@vaughandroid

基本上,当您将模块提供到组件中时,您可以覆盖您的方法。

MyComponent component = DaggerMyComponent.builder()
.appModule(new AppModule() {
  @Override public Foo provideFoo() { 
      return new Bar(); 
  }
})
.build();  
Run Code Online (Sandbox Code Playgroud)

这对我有用,我想它也会对你有用。