使用不带“注入”指令的Dagger模块

我试图让匕首在@Module注释中没有“injects”指令的情况下工作。 我将我的testing项目放在Android Simple Dagger示例上

这是给我的问题的一部分:

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

(编辑):在我的代码是CTXModules.java

我想删除的部分是“injects = HomeActivity.class”。 我知道我可以在构造函数中用@Inject注解标记我自己的模块,以删除那里的那部分,但不知何故它不能与添加到graphics中的模块一起工作。 在那里,一切正常。

我需要这个的原因是因为匕首将在一个基础库项目中实现,这个基础项目将是一些共享一个通用代码库的项目的基础,因此目前还是写这部分代码我不知道类将注入模块。

我试图做甚至可能吗?

我认为这是可能的,因为Android模块类不使用该指令。

希望它是清楚的。 提前致谢!

(编辑)

我应该提到它。 在我的模块中,我删除了“injects = HomeActivity.class”,并添加“库= true”在Android模块类 。 然后会发生什么,我得到这个错误(我不好,我没有添加它之前):

 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 

另外,我已经将我的testing项目上传到github

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

Solutions Collecting From Web of "使用不带“注入”指令的Dagger模块"

你要

 @Module(library=true) 

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

假如这个模块中包含的所有绑定都是必需的,以满足所有的注入types。 如果一个模块不是一个库模块,它有资格进行额外的静态检查:工具可以检测到包含的绑定是否是必要的。 如果你提供了这个模块graphics没有使用的绑定,那么你必须声明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);