我希望能够使用 Guice 注入通用接口的通用实现。
public interface Repository<T> {
void save(T item);
T get(int id);
}
public MyRepository<T> implements Repository<T> {
@Override
public void save(T item) {
// do saving
return item;
}
@Override
public T get(int id) {
// get item and return
}
}
在 C# 中使用 Castle.Windsor,我能够to do:
Component.For(typeof(Repository<>)).ImplementedBy(typeof(MyRepository<>))
但我认为 Guice 中不存在同等的东西。我知道我可以使用TypeLiteral
在 Guice 中注册各个实现,但是有没有办法像在 Windsor 中一样一次性注册它们?
Edit:
这是一个用法示例:
Injector injector = Guice.createInjector(new MyModule());
Repository<Class1> repo1 = injector.getInstance(new Key<Repository<Class1>>() {});
Repository<Class2> repo2 = injector.getInstance(new Key<Repository<Class2>>() {});
尽管更可能的用法是注入到另一个类中:
public class ClassThatUsesRepository {
private Repository<Class1> repository;
@Inject
public ClassThatUsesRepository(Repository<Class1> repository) {
this.repository = repository;
}
}
为了在 Guice 中使用泛型,您需要使用类型文字类来绑定通用变体。这是 Guice 注入器配置的示例:
package your-application.com;
import com.google.inject.AbstractModule;
import com.google.inject.TypeLiteral;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<Repository<Class1>>(){})
.to(new TypeLiteral<MyRepository<Class1>>(){});
}
}
(Repository是泛型接口,MyRepository是泛型实现,Class1是泛型中使用的具体类)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)