Guice Wrap общие инъекции - PullRequest
       6

Guice Wrap общие инъекции

3 голосов
/ 26 октября 2010

Можно ли как-то обернуть общие инъекции?

Учитывая интерфейс:

interface IFoo<T>

В моем модуле guice:

bind((Key<IFoo<SomeType>) Key.get(Types.newParameterizedType(IFoo.class, SomeType.class))).to(Foo.class);

Но прежде чем вернуть экземпляр Foo, я хочу обернуть его следующим образом:

class FooWrapper<T> implements IFoo<T> { public FooWrapper(Foo<T> foo) { ... } }

Где-то так:

return new FooWrapper<T>(foo);

1 Ответ

2 голосов
/ 26 октября 2010

Вот один из способов сделать это:

public class FooModule extends PrivateModule {
  @Retention(RUNTIME) @BindingAnnotation
  private @interface Internal {}

  @Override protected void configure() {
    bind(new TypeLiteral<IFoo<SomeType>>(){}).annotatedWith(Internal.class)
        .to(new TypeLiteral<Foo<SomeType>>(){});
  }

  @Provides @Exposed IFoo<SomeType> provideFoo(@Internal IFoo<SomeType> foo) {
    return new FooWrapper<SomeType>(foo);
  }
}

Другая вещь, которая может работать хорошо, это добавить общую аннотацию, такую ​​как @Wrapped, а затем объявить конструктор FooWrapper следующим образом:

@Inject public FooWrapper(@Wrapped IFoo<T> foo) { ... }

Тогда в вашем личном модуле вы можете связать Foo с аннотацией @Wrapped, связать и выставить FooWrapper как обычно, без необходимости использования метода @Provides.

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

...