使用没有“injects”指令的Dagger模块

时间:2013-12-09 18:00:23

标签: java android dagger

我试图在没有@Module注释中的“injects”指令的情况下使Dagger工作。我的测试项目基于Android Simple Dagger example

这是给我带来问题的部分:

@Module(
    injects = HomeActivity.class,
    complete = false
)
public class DemoModule {
  // TODO put your application-specific providers here!
}

(编辑):我的代码中有CTXModules.java

我要删除的部分是“injects = HomeActivity.class”。我知道我可以在构造函数中用@Inject注释标记我自己的模块以删除那里的那个部分,但不知何故它不能用于添加到图形中的模块。有了那条线,一切都很好。

我需要这个的原因是因为dagger将在一个基础库项目中实现,该项目将成为共享公共代码库的一些项目的基础,因此目前或编写代码的这一部分我不会知道哪些类会注入模块。

我想做的甚至可能吗?

我认为这是可能的,因为Android Module class不使用该指令。

希望它足够清楚。提前谢谢!

(编辑)

我应该提到它。在我的模块中,我删除“injects = HomeActivity.class”并在Android Module class中添加“library = true”。然后会发生这样的错误(我的错误,我以前没有添加):

12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main
12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783
12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Looper.loop(Looper.java:137)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.main(ActivityThread.java:4998)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invoke(Method.java:515)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dalvik.system.NativeStart.main(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783): Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:281)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:258)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MyApplication.inject(MyApplication.java:47)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.BaseActivity.onCreate(BaseActivity.java:27)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MainActivity.onCreate(MainActivity.java:16)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Activity.performCreate(Activity.java:5243)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-10 09:21:16.807: E/AndroidRuntime(21783):    ... 11 more

另外,我上传了my test project to github

(最终编辑)根据杰克的回答:“将模块声明为库并不能减轻Dagger了解注入点的需求。”因此,我原来的问题的答案是,这是不可能的。

1 个答案:

答案 0 :(得分:24)

你想要

@Module(library=true)

以下是文档对library所说的内容:

  

如果此模块中包含的所有绑定都必须满足其所有可注入类型,则返回false。如果模块不是库模块,则可以进行其他静态检查:工具可以检测是否不需要包含绑定。 如果您提供此模块图表未使用的绑定,则必须声明library = true。

(强调我的)


将模块声明为库并不能减轻Dagger了解注入点的需求。您仍然必须使用列出的注入声明对象图中的模块。

您的示例的极端简化版本如下所示:

repo/
 +- library/
 |   +- Foo.java
 |   `- FooModule.java
 |
 `- app/
     +- BarActivity.java
     `- BarModule.java

FooModule.java

@Module(library = true)
public final class FooModule {
  @Provides @Singleton provideFoo() {
    return Foo();
  }
}

BarModule.java

@Module(
  injects = BarActivity.class,
  includes = FooModule.class
)
public final class BarModule {
}

BarActivity.java(或类似):

ObjectGraph og = ObjectGraph.create(new BarModule());
og.inject(this);