dependency-injection - Dagger:覆盖作用域模块中的@Provides-Method

标签 dependency-injection dagger

让我们假设以下情况。有一个全局模块AppModule , 范围模块 ScopedModule , 一类Main和一个类(class)Foo在应用程序的主要变体中。此外,还有一个带有模块 DebugAppModule 的调试变体。 , 一个模块 DebugScopedModule和一个类(class)Bar .只有调试变体可能知道 Bar .

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

@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());

调试变体包含以下相关代码摘录。

@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());

我的研究和实验表明无法覆盖 @Provides -作用域模块中的方法,即当plus一个模块。参见示例 How to Mock Dagger Activity Object Graphs .也就是说,在调试变体中,只要 Foo注入(inject)它仍然是 Foo而不是 Bar .这是有道理的,因为类 MainScopedModule 有固定的依赖关系(注意 new )。

在我看来,应该有一种方法可以自己注入(inject)作用域模块——可以说是元注入(inject):)。也就是说,AppModule可以提供ScopedModule对于 Main .问题是 ScopedModule的构造函数需要 Main 的实例等等AppModule需要保留 Main 的实例这不会飞(例如,在 Android 特定的上下文中,Main 将是一个 Activity)。

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

最佳答案

在最新版本的 Dagger 中,不允许覆盖 @Provided 方法。

我找到了一个很好的解决方案here .感谢@vaughandroid

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

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

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

关于dependency-injection - Dagger:覆盖作用域模块中的@Provides-Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27639090/

相关文章:

java - 如何从仅在运行时已知的类型中获取 Dagger 实例

dependency-injection - Dagger 中的依赖项优先级

android-gradle-plugin - 如何使用gradle使用方形 Dagger 编译器来处理 "compile-only"?

android - Dagger 不允许我在一个类中使用两个相同类型的对象

dependency-injection - 无法使用 Autofac 将依赖项注入(inject) Signalr Hub

c# - 内部有两个服务和依赖注入(inject)的外观 - 设计模式方法

nhibernate - SimpleInjector : Injection does not work with MVC 4 ASP. NET Web API

java - "No inject registered for a class"即使我声明了它

java - 配置注入(inject)框架

.net - 关于依赖注入(inject)和工厂的疑惑