2013-12-09 1 views
17

@Module 주석 안에 "injects"지시문없이 대거 작업을 수행하려고합니다."injects"지시문을 사용하지 않고 단검 모듈 사용

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

(편집) : 내 코드에 CTXModules.java

내가했던 부분이다 나는 Android Simple Dagger example

이 내 테스트 프로젝트를 기반으로 작성하는 것은 나에게 문제를주고있는 부분이다 제거하는 것은 "injects = HomeActivity.class"입니다. 그 부분을 제거하기 위해 생성자에서 @Inject 어노테이션으로 자신의 모듈을 표시 할 수 있지만 어떻게 든 그래프에 추가 된 모듈에서는 작동하지 않는다는 것을 알고 있습니다. 그 줄이 있으면 모든 것이 잘 작동합니다.

왜냐하면 나는 단검이 공통 코드 기반을 공유하는 일부 프로젝트의 기초가 될 기본 라이브러리 프로젝트에서 구현 될 것이기 때문에 순간적으로 또는 코드의이 부분을 작성하기 때문에 어떤 수업이 모듈을 주입 할 지 알지 못합니다.

내가 할 수있는 일이 가능한 것일까 요?

Android Module class은 해당 지침을 사용하지 않았기 때문에 가능하다고 생각합니다.

희망이 충분히 있습니다. 미리 감사드립니다!

(EDIT)

나는 그것을 언급해야한다. 내 모듈에서는 "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

(최종 편집) 업로드 한 제이크의 대답에 따라 : "모듈을 선언 무엇 다음 일이 내가 (내 나쁜 내가 전에 그것을 추가하지 않음)이 오류가 있다는 것입니다 도서관이 주사위 점에 대해 알기 위해 단검의 필요성을 경감시키지 못한다. " 그러므로 원래의 질문에 대한 대답은 가능하지 않다는 것입니다.

답변

24

당신은

@Module(library=true) 

가 여기에 문서가 무슨 말하고자 대한 library :

거짓이 모듈에 포함 된 모든 바인딩이 주 유형 모두 만족하는 데 필요한 경우. 모듈이 라이브러리 모듈이 아닌 경우 추가 정적 검사를받을 수 있습니다. 도구는 포함 된 바인딩이 필요하지 않은지 여부를 감지 할 수 있습니다. 이 모듈의 그래프에서 사용하지 않는 바인딩을 제공하는 경우 library = true를 선언해야합니다. 라이브러리가 주입 지점에 대해 알고 단검의 요구를 완화하지 않는 모듈을 선언

(강조 광산)


. 나열된 삽입을 사용하여 객체 그래프에 모듈을 선언해야합니다.

귀하의 예제의 극단적 인 단순화 된 버전은 다음과 같이 보일 것이다 :

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); 
+0

감사합니다. Jake, 저도 이미 시도했지만 여전히 작동하지 않습니다. 나의 나쁜 나는 그것을 지정하지 않았다. 더 관련성이 높은 정보로 내 질문을 편집했으며 테스트 프로젝트를 github에 추가하고 언급 한 클래스에 대한 링크를 추가했습니다. – spCoder

+1

라이브러리 모듈의 다운 스트림 소비를 표시하기 위해 내 대답을 업데이트했습니다. Dagger에게 주입 할 수 있도록하기 위해 어딘가에'주사 '라고 알려줄 필요가 있습니다. –

+2

편집 시작 부분에 지정한대로 : "모듈을 라이브러리로 선언한다고해서 Dagger가 주입 점을 알 필요가 없습니다." 그러므로 원래의 질문에 대한 대답은 가능하지 않다는 것입니다. 감사합니다. Jake! – spCoder