Кинжал с Android: как мне вставлять текущий контекст?

Назад, когда я использовал RoboGuice, мне удалось конструктор внедрить Context в мои классы, и RoboGuice выберет соответствующий контекст (у инъекций в Activity будет контекст активности, в приложениях будет применен контекст текущего приложения, впрыскивается в фрагмент Иметь контекст активности фрагмента и т. Д.).

Есть ли аналогичный метод для достижения этого с помощью кинжала?

public class Thing { @Inject public class Thing(Context context){ // if i'm injected in an Activity, I should be the current activity's context // if i'm injected in an Fragment, I should be the fragment's activity context // if i'm injected in a Service, I should be the service's context // etc... } } 

Solutions Collecting From Web of "Кинжал с Android: как мне вставлять текущий контекст?"

Кинжал не знает об Android. Или что-нибудь, действительно. Если вы хотите что-то ввести, вы должны рассказать об этом Кинжал.

Вы можете увидеть пример того, как вводить Context в примеры . В этом случае квалификатор используется для дифференциации приложения от одного из них.

 /** * Allow the application context to be injected but require that it be annotated with * {@link ForApplication @Annotation} to explicitly differentiate it from an activity context. */ @Provides @Singleton @ForApplication Context provideApplicationContext() { return application; } 

редактировать

Нет, вы не можете вводить неквалифицированный тип и иметь экземпляр этого типа изменения на основе контекста, в котором вы выполняете инъекцию. Кинжал требует, чтобы источник типа был известен во время компиляции, и поскольку графы объектов неизменны, источник не может быть изменен.

Единственный способ сделать это – использовать фабрику, которая позволяет указать контекст, с которым будет создан объект.

 public final class ThingFactory { private final Foo foo; private final Bar bar; @Inject public ThingFactory(Foo foo, Bar bar) { this.foo = foo; this.bar = bar; } public Thing get(Context context) { return new Thing(context, foo, bar); } }