Java 如何在android库项目中使用dagger
我目前正试图将Dagger添加到我的android项目中。对于应用程序项目,如何构建ObjectGraph对我来说既简单又清晰。但我不知道在我的android库项目中,什么是最好的方法 我是否应该继续在应用程序的应用程序类中构建ObjectGraph,并将OG传递给LibraryModule—将library的OG加上应用程序的OG?还是应该在库中构建整个ObjectGraph 如果我需要通过Java 如何在android库项目中使用dagger,java,android,dagger,Java,Android,Dagger,我目前正试图将Dagger添加到我的android项目中。对于应用程序项目,如何构建ObjectGraph对我来说既简单又清晰。但我不知道在我的android库项目中,什么是最好的方法 我是否应该继续在应用程序的应用程序类中构建ObjectGraph,并将OG传递给LibraryModule—将library的OG加上应用程序的OG?还是应该在库中构建整个ObjectGraph 如果我需要通过ObjectGraph.inject(this)在库中注入一个类,该怎么办?在我的应用程序项目中,我可以
ObjectGraph.inject(this)
在库中注入一个类,该怎么办?在我的应用程序项目中,我可以从应用程序类获取OG。但是在图书馆里怎么处理呢?我应该为ObjectGraph添加@Providers方法吗
非常感谢你的帮助
编辑:
简而言之:我如何在我的库项目中调用ObjectGraph.inject(this)
,因为它是在应用程序类中构建的,所以我无法访问OG 我是这样做的:
interface Injector {
void inject(Object object);
public ObjectGraph getObjectGraph();
}
class LibraryActivity extends Activity {
@Inject ActivationModule instance;
void onCreate(... ) {
Injector injector = (Injector)getApplicationContext();
injector.inject(this)
}
}
interface Injector {
void inject(Object object);
public ObjectGraph getObjectGraph();
}
class LibraryActivity extends Activity {
@Inject ActivationModule instance;
void onCreate(... ) {
Injector injector = (Injector)getApplicationContext();
injector.inject(this)
}
}
ActivationModule是库项目中的类/接口
主项目具有应用程序类,该类实现Injector接口,并创建ObjectGraph,该ObjectGraph提供了库项目中ActivationModule的依赖关系
class MyApplicationInTheMainProject extends Application implements Injector {
ObjectGraph graph;
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(new ActivationModuleImpl(this));
}
@Override public void inject(Object object) {
graph.inject(object);
}
@Override public ObjectGraph getObjectGraph() {
return graph;
}
}
@Module(injects = {
LibraryActivity.class
}, library = true)
class ActivationModuleImpl implements ActivationModule {
....
}
如果有人使用Dagger 2来到这里,我在我的应用程序中就是这样做的: 在库模块中,我创建了以下模块和组件:
@Module
public class ModuleUtil {
@Provides
public RestTemplate provideRestTemplate() {
return new RestTemplate();
}
}
@Singleton
@Component(
modules = {
ModuleUtil.class
})
public interface MainComponent {
void inject(Postman postman);
}
为了管理注入,我创建了下面的单例:
public class DaggerWrapper {
private static MainComponent mComponent;
public static MainComponent getComponent() {
if (mComponent == null) {
initComponent();
}
return mComponent;
}
private static void initComponent () {
mComponent = DaggerMainComponent
.builder()
.utilModule(new ModuleUtil())
.build();
}
}
当库模块中的某个类需要注入其成员时,我只需调用
daggerRapper.getComponent().inject(this)代码>仅此而已。如果您将此库提供给其他人,而他们对您的场景一无所知,那么您必须以一种方式编写它,即您的匕首可以完美地工作,而无需用户的任何帮助。(越容易操作,实践越好)
我只是写了一些库给你看如何做。我编写这个库时,您甚至可以独立运行它,并在messages选项卡中查看结果。您库的用户不需要对dagger一无所知,也不需要做任何事情,他只需使用库,dagger将被配置为:
如果此库是您自己使用的,并且用于您自己的项目,那么最好的做法是在my friend的项目中这样做:
这两个项目回答了您所有的问题。问任何问题,我都会在评论中回答。我也有这个问题。。。有人知道怎么做吗?@sebastian你解决了你的问题吗?如果是,那么发布你的解决方案。我被困在Dagger 2中。你的库不应该从属于其父对象的对象图中被注入。它不再是图书馆了。库不依赖于它的父库。您可以考虑创建某种类型的基础/核心模块,其中包含您的库可以依赖的对象图。有人能帮我吗?我知道DaggerRapper也在你的库模块中,可以从你的应用模块访问它。这是正确的吗?这似乎是一个更好的答案,因为它不需要应用程序(库的客户机)的任何东西。它可以工作吗?遵循相同的过程,但不起作用。我在构建应用程序时遇到“找不到符号类DaggerComponent”错误。您是否尝试过使用dagger android库来简化设置:如果有人遇到DaggerComponent错误,请确保在build.gradle-apply plugin中添加以下两个依赖项:“kotlin android”apply plugin:“kotlin kapt”。但这个解决方案对我有效。