库几乎就像一个应用程序(当涉及到Dagger时)。是的,你没有对象,但你真的不需要一个。application
作为你的图书馆的消费者,我希望它易于使用,所以我根本不想知道匕首是什么(或者你是否在内部使用它)。
例如,让您的用户在首次调用您的库时通过 a。有一个(我认为你的示例称之为包装器),它具有对接口的静态引用。Context
DaggerInjector
Component
示例(因此,只是一个通用示例):
public class DaggerInjector {
private static YourComponent component;
private DaggerInjector() {
super();
}
public static YourComponent getComponent() {
return component;
}
public static YourComponent buildComponent(Context context) {
component = DaggerYourComponent
.builder()
.yourModule(new YourModule(context))
.build();
return component;
}
}
您的“模块”可以如下所示:
@Module
public class YourModule {
private Context context;
public YourModule(Context context) {
this.context = context;
}
@Provides
@Singleton
final Context providesContext() {
return context;
}
}
要使用它:
让用户调用方法(或者,如果组件为 null,则首次自行调用该方法):
DaggerInjector.buildComponent(context);
这将确保初始化 Dagger 组件并生成代码。要知道调用是一项昂贵的任务(Dagger 必须做很多事情!),所以只做一次(除非你需要使用仅在运行时已知的不同值重新初始化库)。buildComponent
一些图书馆只是在每次通话中都要求上下文,因此这并非不可能;然后,您可以在第一次调用时初始化 dagger(通过检查 getComponent() 在注入器中是否为空)。
在你的不再为空之后,你现在可以添加和适当的“可注射”的东西......DaggerInjector.getComponent()
@Inject
例如:在你可以有:YourModule
@Provides
SomeObject providesSomeObject() {
return new SomeObject();
}
// THIS “Context” here is automatically injected by Dagger thanks to the above.
@Provides
@Singleton
SomeOtherObject providesSomeOtherObject(Context context) {
return new SomeOtherObject(context); //assume this one needs it
}
在任何“可注入”对象(即,在您的组件中具有方法的对象...)中,您可以执行以下操作:inject
public class AnObjectThatWantsToInjectStuff {
@Inject
SomeObject someObject;
@Inject
SomeOtherObject someOtherObject;
public AnObjectThatWantsToInjectStuff() {
super();
DaggerInjector.getComponent().inject(this);
// you can now use someObject and someOtherObject
}
}
要使上述内容正常工作,您需要在(这是一个接口)代码中,如下所示:YourComponent
void inject(AnObjectThatWantsToInjectStuff object);
(否则调用将在编译时失败)DaggerInjector.getComponent().inject(this)
注意我从来没有传递过上下文,匕首已经知道如何获得它。YourInjectableContext
小心泄漏。我建议您存储而不是对所有/大多数情况都只进行普通存储(除非您明确需要活动上下文来扩展布局/主题目的,否则使用应用程序提供的应用程序上下文就是您所需要的)。context.getApplicationContext()
Context