如何在android库项目中使用匕首

我目前正在试图添加匕首到我的android项目。 对于应用程序项目,我很容易和清楚,如何构buildObjectGraph。 但我不知道什么是在我的android库项目中做到这一点最好的方法。

我应该继续在应用程序的Application类中构buildObjectGraph,并将OG传递给LibraryModule – 将库的OG插入到Apps OG中? 还是应该在库中构build整个ObjectGraph?

如果我需要通过ObjectGraph.inject(this)在库中注入一个类,该怎么办? 在我的应用程序项目中,我可以从应用程序类中获取OG。 但在图书馆如何处理这个问题呢? 我应该为ObjectGraph添加@Provides方法吗?

非常感谢您的帮助。

编辑:简而言之:如何在我的图书馆项目中调用ObjectGraph.inject(this) ,因为它是在应用程序类中构build的,所以我无法访问OG。

Solutions Collecting From Web of "如何在android库项目中使用匕首"

如果有人使用Dagger 2进入这里,这是我在我的应用程序中完成的方式:

在库模块中,我创build了以下模块和组件:

 @Module public class ModuleUtil { @Provides public RestTemplate provideRestTemplate() { return new RestTemplate(); } } @Singleton @Component( modules = { ModuleUtil.class }) public interface MainComponent { void inject(Postman postman); } 

然后我创build了下面的Singleton来pipe理注入:

 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. @Module类属于主项目,它们提供了要注入到库元素中的实现,因此库项目中没有@Module类

  2. 期望依赖性的库元素必须能够访问ObjectGraph并自己调用.inject(),但是主项目应该使用提供的@Module依赖项将ObjectGraph实例提供给库

  3. 如何从主项目中获取ObjectGraph到图书馆? 你可以有这样的接口:

     interface Injector { void inject(Object object); public ObjectGraph getObjectGraph(); } 

像Activity或Application类这样的上下文对象实现了这个接口(ObjectGraph对象的持有者)。

如果你在库模块中有Activity的例子,它需要从主项目注入一些东西,如下所示:

 class LibraryActivity extends Activity { @Inject ActivationModule instance; void onCreate(... ) { Injector injector = (Injector)getApplicationContext(); injector.inject(this) } } 

ActivationModule是库项目中的类/接口。

主要项目有实现Injector接口的应用程序类,为库项目中的ActivationModule创buildObjectGraph并提供依赖。

 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 { .... } 

如果你把这个图书馆给人,而且他们对你的情景一无所知,所以你必须用一种你的匕首完美的书写方式,而不需要用户的帮助。 (更好的做法更容易)

我刚刚给你写了一些图书馆来展示如何去做。 我编写库的方式,你甚至可以单独运行,并在消息选项卡中看到结果。 你的图书馆的用户并不需要对匕首一无所知,他只是使用库和匕首将被configuration:

https://github.com/amirziaratii/libraryUsingDagger.git

如果这个图书馆是你自己使用它的东西,并为你自己的项目,最好的做法就是在我的朋友的这个项目中做:

https://github.com/mmirhoseini/trakt.tv

所有的问题都在这两个项目中得到解答。 在评论中提出任何问题和错误的答案。

下面是在应用程序中如何使用匕首的完整示例步骤1将项目级别添加到项目级别gradle classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'步骤2模块级别depedancy

应用插件:'com.android.application'apply插件:'android-apt'apply plugin:'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步用你的应用程序类build立匕首

公共类TubeMateApp扩展应用程序{

 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像这样创buildAppModule

@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创build应用程序组件需要注入匕首应用程序组件在这里步骤6在主飞溅活动中使用匕首如何应用匕首注入看这个截图