我有一个使用香草Guice的Guice项目;
没有Assisted-Inject,没有AOP,没有额外的插件扩展Guice等。
为了在Android上更轻松地运行它,Dagger似乎是一个更好的解决方案。
每个类都有一个依赖项和一个带@Inject
注释的构造函数。
没有使用场或方法注入。
模块非常简单(使Guice成为一种矫枉过正的东西)并且大多包含如下所示的绑定:
class SomethingModule extends AbstractModule {
protected void configure() {
Bind(Handler.class)
.annotatedWith(Names.named("something"))
.to(SomeImplementation.class);
}
}
}
后来使用如下:
Injector inj = Guice.createInjector(new SomethingModule());
... = inj.getInstance(SampleInterface.class);
// and rest of the code.
不幸的是, 我无法理解Daggers terminology。 您能指导我将Guice模块直接转换/转换为Dagger模块吗?
Dagger:
@Provides
@Inject
Guice:
@Inject
@Named
(或任何自定义注释,如果正确实施)。AbstractModule
。@Provides
。Injector
从模块创建。这些如何相关?
更新:除了EpicPandaForce的好答案外,these slides也可以提供帮助。
答案 0 :(得分:4)
Bind(Handler.class)
.annotatedWith(Names.named("something"))
.to(SomeImplementation.class);
会转换为
@Module
public class SomethingModule {
@Provides
@Named("something")
//scope if needed
public Handler handler() {
return new SomeImplementation();
}
}
哪个将被绑定到" Injector
" (组分):
@Component(modules={SomethingModule.class})
//scope if needed
public interface SomethingComponent {
@Named("something")
Handler handler();
void inject(ThatThingy thatThingy);
}
这是一个"注射器"您必须使用APT生成的构建器创建:
SomethingComponent somethingComponent = DaggerSomethingComponent.builder()
.somethingModule(new SomethingModule()) //can be omitted, has no params
.build();
somethingComponent.inject(thatThingy);
那件事有什么
public class ThatThingy {
@Inject
@Named("something")
Handler handler;
}
组件通常存在每个范围,因此例如@ApplicationScope
有一个"注入器" (零件)。可以使用子组件和组件依赖性来实现范围。
重要的是,组件具有提供方法(如果使用组件依赖关系,则是继承到子范围组件的依赖关系)和void inject(X x);
格式化方法。对于现场注入每种具体类型,这是必需的。例如,基类只能注入本身,而不其子类。但是,您可以编写一个名为protected abstract void injectThis()
的方法,该方法也会调用子类上的.inject(this)
。
由于我还没有真正使用过Guice,我不确定我是否错过任何事情。我想我忘记了构造函数注入,这是一个问题,因为虽然Dagger支持它,但它无法重新配置。对于重新配置,您必须使用模块,并自己在构造函数中进行注入。
@Module(includes={ThoseModule.class, TheseModule.class})
public abstract class SomethingModule {
@Binds
abstract Whatever whatever(WhateverImpl impl);
}
@Singleton
public class WhateverImpl implements Whatever {
Those those;
These these;
@Inject
public Whatever(Those those, These these) {
this.those = those;
this.these = these;
}
}
@Component(modules={SomethingModule.class})
@Singleton
public interface SomethingComponent {
These these();
Those those();
Whatever whatever();
}