2013-04-22 7 views
3

Если у меня есть значение по умолчанию для класса, и он определяет конструктор @Inject, это здорово. Система подбирает его.Могу ли я переопределить привязку в кинжале?

Если одно приложение хочет переопределить это значение по умолчанию с помощью подкласса, я могу определить @Provides в своем модуле и вызвать «новый» в этом подклассе в моем собственном коде, а кинжал использует этот имп вместо (из чего я могу скажем, это работает).

Однако, если я хочу, чтобы кинжал создавал экземпляр этого подкласса, есть ли способ сделать это, не объявив «override = true» в @Module? Мне нравится не иметь override = true, чтобы все дубликаты проверок во время сборки давали мне соответствующие предупреждения.

Один из способов сделать это, конечно, заставить все приложения прямо объявлять @Provides. Это просто добавляет к раздуванию.

Раньше я использовал GIN (Guice для GWT), и вы можете определить привязку к классу, который вы хотите по ссылке .class, но я не вижу ничего подобного в кинжале.

ответ

3

Прямо сейчас нет способа привязки по умолчанию, которую вы можете свободно переопределить, не используя атрибут «overrides» (который больше предназначен для тестирования, чем этот.) Мы рассматриваем, как выполнять привязки по умолчанию ,

Вы могли бы рассмотреть возможность использования набора привязки, чтобы сделать это, имея что-то вроде вдоль этих линий:

@Module(...) 
class MyModule { 
    @Qualifier @interface OverridableFoo { } 

    @Provides(type=SET_VALUES) @OverridableFoo Set<Foo> provideOverriddenFoo() { 
    return new HashSet<Foo>(); // Empty set to ensure the Set is initialized. 
    } 

    @Provides Foo provideFoo(@OverridableFoo Set<Foo> Foo overriddenFoo) { 
    switch (overriddenFoo.size()) { 
     case 0: return new DefaultFooImpl(); 
     case 1: return overriddenFoo.iterator().next(); 
     default: throw new IllegalStateException("More than one overridden Foo Provided."); 
    } 
    } 
} 

Затем, когда вы хотите заменить, вы просто включить это:

@Module(...) 
class MyModule { 
    @Provides(type=SET_VALUE) @OverridableFoo Foo provideBetterFoo() { 
    return new MyAwesomeFoo(); 
    } 
} 

Это не отличный способ, так как он перемещает то, что должно быть ошибкой времени компиляции во время выполнения, но в качестве стоп-зазора, когда мы пытаемся решить, как обрабатывать привязки по умолчанию, я считаю, что он работоспособен.