Chciałbym móc wstrzykiwać ogólną implementację ogólnego interfejsu za pomocą Guice.Wstrzykiwanie implementacji ogólnej za pomocą 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
}
}
W języku C# z wykorzystaniem Castle.Windsor, byłbym w stanie to do:
Component.For(typeof(Repository<>)).ImplementedBy(typeof(MyRepository<>))
ale nie sądzę odpowiednik istnieje w Guice. Wiem, że mogę użyć TypeLiteral
w Guice do zarejestrowania poszczególnych implementacji, ale czy istnieje sposób na zarejestrowanie ich wszystkich naraz, tak jak w Windsor?
Edit:
Oto przykład użycia:
Injector injector = Guice.createInjector(new MyModule());
Repository<Class1> repo1 = injector.getInstance(new Key<Repository<Class1>>() {});
Repository<Class2> repo2 = injector.getInstance(new Key<Repository<Class2>>() {});
Chociaż bardziej prawdopodobne wykorzystanie byłoby wstrzyknięcie do innej klasy:
public class ClassThatUsesRepository {
private Repository<Class1> repository;
@Inject
public ClassThatUsesRepository(Repository<Class1> repository) {
this.repository = repository;
}
}
można dodać fragment pokazujący jak byś lubisz to zrobić? –
Jestem z tobą, chcę zrobić to samo. Każdy powinien mieć ten problem. Musi być coś, o czym nam nie mówią. :) – PapaFreud
Chciałbym również znać rozwiązanie, nie wiem nic o C#, ale oczywiste, że sposób C# jest znacznie bardziej nowoczesny. – Mike