是否可以以某种方式包装通用注射?
鉴于界面:
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);
答案 0 :(得分:2)
这是你可以做到这一点的一种方式:
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
方法。
我可能还有更好的方法可以解决这个问题。还要记住,方法拦截通常也是用其他行为来装饰接口实现的好方法。