我是Dagger的新手,在某些Dagger项目上遇到了@Provides的替代方法,这让我开始思考两种方法之间是否存在实际差异。
公用代码:
class DependencyOne {
@Inject DependencyOne();
}
class DependencyTwo {
@Inject DependencyTwo();
}
方法1:
class MyClass {
Resource r;
@Inject MyClass(DependencyOne d1, DependencyTwo d2) {
r = Resource.builder().addDependencies(d1,d2).build();
}
Resource getResource() {
return r;
}
}
@Component interface MyComponent {
MyClass getMyClass();
}
// Get the resource using
DaggerMyComponent.create().getMyClass().getResource();
方法2:
@Module class MyModule {
@Provides static Resource getResource(DependencyOne d1, DependencyTwo d2) {
return Resource.builder().addDependencies(d1,d2).build();
}
}
@Component(modules={MyModule.class})
interface MyComponent {
Resource getResource();
}
// Get the resource using
DaggerMyComponent.create().getResource();
现在,我知道我可能对此进行了过多思考,但是两种方法(性能或其他方面)之间是否有实际差异?是其中一个比另一个更受欢迎吗?
@Provides
方法和构造函数注入是Dagger 2的最佳实践。直接调用该组件并要求像Resource
这样的单个依赖项可能要最小化。
说您有一个想要使用Resource
的班级。您为@Provides
编写Resource
方法。然后,您可以编写这样的类:
@Inject
class ResourceConsumer {
private final Resource resource;
@Inject
ResourceConsumer(Resource resource) {
this.resource = resource;
}
}
因为Dagger 2知道如何提供Resource
,所以它将知道如何提供ResourceConsumer
。然后,您可以随时随地注入ResourceConsumer
。