【发布时间】:2011-05-13 10:34:55
【问题描述】:
我希望能够使用 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 中不存在等价物。我知道我可以在 Guice 中使用 TypeLiteral 来注册单个实现,但是有没有办法像在 Windsor 中一样一次性注册它们?
编辑:
这是一个使用示例:
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;
}
}
【问题讨论】:
-
您能否添加一个 sn-p 显示您希望如何使用这个?
-
我和你在一起,我想做同样的事情。每个人都应该有这个问题。一定有什么他们没有告诉我们的。 :)
-
我也想知道解决方案,我对 C# 一无所知,但显然 C# 方式更现代。
-
仍然没有可用的解决方案?对所有可能的通用值重复绑定是浪费时间。当然,在某些特殊情况下,您实际上可能想要一个不同的实现,但它不应该是默认的。
标签: java ioc-container guice typeliteral