在依赖组件中的使用
在依赖组件的层次结构的上下文中,例如这个例子 https://github.com/codepath/dagger2-example, 提供方法例如Foo foo()
用于公开对依赖组件的绑定。 “Expose”的意思是“提供”甚至“发布”。请注意,方法本身的名称实际上是不相关的。一些程序员选择命名这些方法Foo exposeFoo()
使方法名称反映其目的。
解释:
当您在 Dagger 2 中编写组件时,您将包含以下内容的模块组合在一起@Provides
方法。这些@Provides
方法可以被认为是“绑定”,因为它们将抽象(例如类型)与解析该类型的具体方法相关联。考虑到这一点,Foo foo()
方法使组件能够公开其绑定Foo
到依赖组件。
Example:
比方说Foo
是一个应用程序单例,我们希望将其用作实例的依赖项DependsOnFoo
但在范围较窄的组件内。如果我们写一个天真的@Provides
的模块之一内的方法MyDependentComponent
然后我们会得到一个新的实例。相反,我们可以这样写:
@PerFragment
@Component(dependencies = {MyComponent.class }
modules = { MyDependentModule.class })
public class MyDependentComponent {
void inject(MyFragment frag);
}
和模块:
@Module
public class MyDepedentModule {
@Provides
@PerFragment
DependsOnFoo dependsOnFoo(Foo foo) {
return new DependsOnFoo(foo);
}
}
还假设注射部位为DependentComponent
包含DependsOnFoo
:
public class MyFragment extends Fragment {
@Inject DependsOnFoo dependsOnFoo
}
注意MyDependentComponent
只知道模块MyDependentModule
。通过该模块,它知道它可以提供DependsOnFoo
使用一个实例Foo
,但它不知道如何提供Foo
通过它自己。有时候是这样的despite MyDependentComponent
是一个依赖的组成部分MyComponent
. The Foo foo()
中的方法MyComponent
允许依赖组件MyDependentComponent
to use MyComponent
的绑定为Foo
注射DependsOnFoo
。没有这个Foo foo()
方法,编译会失败。
用于解析绑定
假设我们想获得以下实例Foo
无需打电话inject(this)
. The Foo foo()
组件内的方法将允许以与您可以调用的方式大致相同的方式getInstance()
与吉斯的Injector https://google.github.io/guice/api-docs/latest/javadoc/index.html或温莎城堡Resolve https://github.com/castleproject/Windsor/blob/master/docs/three-calls-pattern.md。图示如下:
public void fooConsumer() {
DaggerMyComponent component = DaggerMyComponent.builder.build();
Foo foo = component.foo();
}