2013-10-02 2 views
6

У меня есть этот класс:Почему кинжал не сбой во время компиляции, когда класс в предложении injection не может быть введен?

public class ClassWithoutInject { 

} 

... и этот модуль ...

@Module(
     injects={ 
       ClassWithoutInject.class 
     }) 
public class SimpleModule { 
} 

я не прав, полагая, что это должно генерировать ошибку во время компиляции? Во время выполнения я получаю:

Unable to create binding for com.example.ClassWithoutInject required by class com.example.SimpleModule 

(Поскольку класс не имеет конструктора @ Inject-annotated). Но не должен ли кинжал знать, что во время компиляции?

+0

У вас есть кинжал-компилятор на вашем пути к классу? –

+0

Да. (Если бы я этого не сделал, я думаю, что он сказал бы что-то о недействительном модуле, вы уверены, что генерация кода была запущена). Если я добавлю конструктор @ Inject-annotated в этот класс, все станет хорошо. –

+0

О, право. v1.1 + требует использования компилятора ... Мне придется попробовать локально позже. Или кто-то еще сможет помочь до этого. –

ответ

0

Где вы в действительности вводите ClassWithoutInjects?

injects Модуль содержит классы, которые будут запрашивать зависимости от предоставленного этим модулем.

Так что в этом случае Dagger ожидает ClassWithoutInjects для запроса зависимостей от ObjectGraph с зависимостями, предоставляемыми этим модулем (который в настоящее время пуст).

Если вы хотите предоставить ClassWithoutInjects в качестве зависимости, а не как потребитель зависимостей (который является тем, что он настроен, как в модуле), либо добавьте @Inject в его конструктор, либо добавьте явный метод поставщика в модуль.

@Module 
public class SimpleModule { 
    @Provides ClassWithoutInjects provideClassWithoutInjects() { 
    return new ClassWithoutInjects(); 
    } 
} 

Если ClassWithoutInjects является потребителем зависимостей.

@Module(injects = ClassWithoutInjects.class) 
public class SimpleModule { 
    // Any dependencies can be provided here 
    // Not how ClassWithoutInjects is not a dependency, you can inject dependencies from 
    // this module into it (and get compile time verification for those, but you can't 
    // provide ClassWithoutInjects in this configuration 
} 

public class ClassWithoutInject { 
    // Inject dependencies here 
} 
+2

Да, мой вопрос не «почему этот код не работает», а скорее «почему он не работает до выполнения», –

Смежные вопросы