我正在尝试将Dagger添加到我的android项目中。对于应用程序项目,我很容易清楚,如何构建ObjectGraph。但我不知道在我的android库项目中最好的方法是什么。
我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗?或者我应该在库中构建整个ObjectGraph吗?
如果我需要ObjectGraph.inject(this)
在库中注入一个类怎么办?在我的Apps项目中,我可以从Application类中获取OG。但是如何在图书馆处理这个?我应该为ObjectGraph添加@Provides方法吗?
非常感谢你的帮助。
编辑:
简而言之:如何在我无法访问OG的库项目中调用ObjectGraph.inject(this)
,因为它正在Application类中构建?
答案 0 :(得分:29)
如果有人使用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);
}
然后我在下面创建了Singleton以管理注射:
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();
}
}
当库模块中的某个类需要注入其成员时,我只需调用DaggerWrapper.getComponent().inject(this);
即可。
答案 1 :(得分:11)
我这样做:
@Module类属于主项目,它们提供了注入库元素的实现,因此库项目中没有@Module类
期望依赖的库元素必须能够访问ObjectGraph并自己调用.inject(),但是主项目应该使用提供的@Module依赖项将ObjectGraph实例提供给库
如何将ObjectGraph从主项目导入库中?你可以有这样的界面:
interface Injector {
void inject(Object object);
public ObjectGraph getObjectGraph();
}
Activity或Application类之类的Context对象实现了这个接口(ObjectGraph对象的持有者)。
如果您在库模块中有Activity的示例,需要从主项目中注入一些东西,这将是这样的:
class LibraryActivity extends Activity {
@Inject ActivationModule instance;
void onCreate(... ) {
Injector injector = (Injector)getApplicationContext();
injector.inject(this)
}
}
ActivationModule是库项目中的类/接口。
主项目有应用程序类,它实现了Injector接口并创建了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 {
....
}
答案 2 :(得分:4)
如果您将此库提供给人们并且他们对您的场景一无所知,那么您必须以您的Dagger完美工作的方式编写它,而无需用户的任何帮助。 (使用更好的练习更容易)
我刚为你写了一些图书馆来展示如何做到这一点。我以一种你甚至可以独立运行它的方式编写库,并在消息选项卡中查看结果。你的图书馆的用户不需要对匕首一无所知,也没有做任何他只是使用图书馆和匕首的配置:
https://github.com/amirziaratii/libraryUsingDagger.git
如果这个库是您自己使用的,也是您自己的项目,那么最好的做法是在我朋友的这个项目中这样做:
https://github.com/mmirhoseini/trakt.tv
这两个项目都回答了您的所有问题。在评论中提出任何疑问和错误答案。
答案 3 :(得分:-3)
以下是在应用程序中如何使用dagger的完整示例 步骤1将depedancy添加到项目级gradle classpath'com.neenbedankt.gradle.plugins:android-apt:1.8' 第2步模块级别的延迟
申请插件:'com.android.application' apply plugin:'android-apt' 申请插件:'com.neenbedankt.android-apt'
compile 'com.google.dagger:dagger:2.0'
provided 'com.google.dagger:dagger-compiler:2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'
步骤3使用您的应用程序类构建Dagger
公共类TubeMateApp扩展了Application {
public AppComponent component;
public static TubeMateApp singleton;
public static TubeMateApp getInstance() {
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
setupGraph();
}
private void setupGraph() {
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
component.inject(this);
}
public AppComponent component() {
return component;
}
} 步骤4像这样创建AppModule
@Module 公共类AppModule {
private TubeMateApp app;
public AppModule(TubeMateApp application) {
this.app = application;
}
@Provides
public Application provideApplication() {
return app;
}
@Provides
@Singleton
Prefs prefs(){
return Prefs.with(app);
}
// To use your custom requirement code here for example i have used Picasso with in the application
@Provides
@Singleton
Picasso getPicasso(){
return Picasso.with(app);
}
@Provides
@Singleton
LayoutInflater getLayoutInflater() {
return (LayoutInflater) app.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
} 步骤5创建需要注入的应用程序组件 dagger App Components here 步骤6在主要飞溅活动中使用匕首 how to apply dagger inject see this screenshot